static_assert和类模板

时间:2017-05-03 13:53:36

标签: c++ c++11 templates static-assert

我对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>;
};

但这是不正确的。

2 个答案:

答案 0 :(得分:5)

对于B<A<1>> b;A<1>仅用作模板参数,不会导致implicit instantiation类模板A,而static_assert内{ {1}}的定义不会被触发。

  

当代码引用需要完全定义类型的上下文中的模板时,或者当类型的完整性影响代码,并且尚未显式实例化此特定类型时,将发生隐式实例化。例如,构造此类型的对象时,而不是构造指向此类型的指针时。

另一方面,对于AA<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,那么您的断言就会失败。