如何解决需要带有纯抽象类类型参数的子句?
考虑以下简单的 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 中的 parameter-declaration 不是定义,就像 parameter-declaration 在函数的非定义声明不是定义 ([basic.def]/2.8)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。