我对static_assert
功能有疑问。当我直接实例化一个类模板时,一切都按预期工作。但是当我将其作为不同类模板的参数传递时,static_assert
不起作用。
template <int X>
class A{
static_assert(X == 0, "X != 0");
};
template <class T>
class B{
};
B<A<1>> b; // Static assert does not work
A<1> a; // error: static assertion failed: X != 0
修改
谢谢大家的答案。有没有办法显式实例化A而不创建A实例/从A继承?我正在尝试这个:
template <int X>
class A{
static_assert(X == 0, "X != 0");
};
template <class T>
class B;
template <template <int X> class T, int X>
class B<T<X>>{
template class T<X>;
};
但这是不正确的。
答案 0 :(得分:5)
对于B<A<1>> b;
,A<1>
仅用作模板参数,不会导致implicit instantiation类模板A
,而static_assert
内{ {1}}的定义不会被触发。
当代码引用需要完全定义类型的上下文中的模板时,或者当类型的完整性影响代码,并且尚未显式实例化此特定类型时,将发生隐式实例化。例如,构造此类型的对象时,而不是构造指向此类型的指针时。
另一方面,对于A
,A<1> a;
必须是完整类型(构造A<1>
),然后发生隐式实例化,a
被触发。
修改强>
您可以使用static_assert
(要求类型完整)来导致隐式实例化并触发sizeof
。 e.g。
static_assert
答案 1 :(得分:1)
您的班级模板B
对其T
没有任何作用,因此其T
未实例化。
因此A<1>
中的B<A<1>>
“没有任何反应”。
如果T a
内有成员B
,那么您的断言就会失败。