c++ - 需要带有纯抽象类类型参数的子句?

标签 c++ language-lawyer abstract-class c++20 c++-concepts

考虑以下简单的 concept :

template <typename T>
concept C = requires(T a) { a.f(); };
如果我们将抽象类类型作为 requires 表达式的参数会发生什么?
struct B { virtual void f() = 0; };

static_assert(C<B>);
gcc-trunk 和 msvc-trunk 然而,断言,clang-trunk、gcc-10.2 和 msvc v19.24 reject断言。
标准怎么说?

最佳答案

GCC-trunk 和 MSVC-trunk 是正确的。由于 P0929,对抽象类型使用的限制在 C++17 和 C++20 之间发生了变化。 .因此,现在甚至允许带有抽象参数类型的普通函数声明:

void foo(B b);  // ill-formed in C++17, well-formed in C++20
void foo(B b) { /* ... */ }  // still ill-formed in C++20
删除了“抽象类不得用作参数类型...”(C++17 [class.abstract]/3)的措辞。在 C++20 中,仅当函数被调用 ([expr.call]/7) 或定义 ([dcl.fct.def.general]/2 )。此外,在 requires-parameter-list 中找到的参数声明不是定义,就像在函数的非定义声明中找到的参数声明不是定义一样 ([basic.def]/2.8)。

关于c++ - 需要带有纯抽象类类型参数的子句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66617103/

相关文章:

c++ - 需要从DLL导出纯基类?

c++ - 限制类型模板参数仅采用特定模板的实例化

c++ - 在 Clang++ 的 C++17 中不能禁用 RVO/NRVO?

c++ - 为什么我们需要 [basic.scope.class]/2?

java - 选择接口(interface)或抽象类

java - 类中的构造函数不能应用于给定类型 - 抽象类

c++ - 对于 C++/XAML 文件,Visual Studio 一次会阻止 UI 几分钟

c++ - 模板中的嵌套类型名称

c++ - 未指定时,C++ 运算符的操作数的值类别是什么?

c++ - C11 & C++11 扩展和通用字符转义