static_assert和类模板

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)

但这是不正确的.

son*_*yao 5

因为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)