val*_*tin 3 c++ templates static-assert c++11
我的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
Run Code Online (Sandbox Code Playgroud)
编辑
谢谢大家的答案.有没有办法显式实例化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>;
};
Run Code Online (Sandbox Code Playgroud)
但这是不正确的.
因为B<A<1>> b;,A<1>仅用作模板参数,它不会导致类模板的隐式实例化A,那么static_assert内部A的定义将不会被触发.
当代码引用需要完全定义类型的上下文中的模板时,或者当类型的完整性影响代码,并且尚未显式实例化此特定类型时,将发生隐式实例化.例如,构造此类型的对象时,而不是构造指向此类型的指针时.
另一方面,因为A<1> a;,A<1>需要是一个完整的类型(构造a),然后发生隐式实例化,static_assert被触发.
编辑
您可以使用sizeof(需要完整的类型)来导致隐式实例化并触发static_assert.例如
template <class T>
class B{
static_assert(sizeof(T) > 0, "static_assert for implicit instantiation");
};
Run Code Online (Sandbox Code Playgroud)