【发布时间】:2021-10-01 21:23:15
【问题描述】:
请考虑一个 C++20 概念程序:
struct A {};
template<typename T>
concept DerivedOnceFromA = requires(T t) { { static_cast<const A&>(t) }; };
template<DerivedOnceFromA T>
struct B {};
struct C : A
{
B<C> foo();
};
这里DerivedOnceFromA 的概念检查T 可以静态转换为A。 B 是遵循此概念的模板结构。而structC是从A派生出来的(所以概念满足),定义了一个返回B<C>的函数。
此代码被 GCC 和 MSVC 接受,但被 Clang 拒绝并出现错误:
constraints not satisfied for class template 'B' [with T = C]
演示:https://gcc.godbolt.org/z/7Tc7xdbeq
在类体内使用类作为概念模板参数是否合法(那么什么编译器是正确的)?
【问题讨论】:
-
仅供参考:有许多种方法可以将类型转换为
A const&。继承不是唯一的方法。如果要检查继承,需要使用derived_from。 -
有趣的是,
std::derived_from对于两个编译器都失败了。 -
不妨跟上潮流并提到标准概念消除了您的自定义概念(除了实施问题)。
template<std::derived_from<A> T>也是如此(因为它要求 A 是 T 的公共且明确的基数)。
标签: c++ c++20 c++-concepts