我完全理解为什么这是无法实现的:
由于没有关于“类层次结构”的信息,因此以下内容无法工作:
class Base {};
class A;
static_assert(std::is_base_of<Base, A>::value, "");
由于没有关于“类层次结构”的信息,因此以下内容无法工作:
class Base {};
class A : public Base {
static_assert(std::is_base_of<Base, A>::value, "");
};
(produce: an undefined class is not allowed as an argument to compiler intrinsic type trait)
在静态断言行上,按照该概念的定义,类型“A”仍未完成。然而,编译器已经了解了“类层次结构”,并可以提供答案。
当然,这个静态断言可以移动到析构函数或其他地方来解决此问题,但有些情况下无法这样做,例如:
class Base {};
template<typename T>
struct type_of {
static_assert(std::is_base_of<Base, T>::value, "T is not derived from Base");
using type = int; //* Some normal type in real use
};
class A : public Base {
public:
type_of<A>::type foo(); // Will not compile
};
它不应该被允许吗?
std::is_base_of
不是核心功能,而是一个库功能,这使得事情变得更加复杂。 - DeiDei