static_assert 和 class 模板

static_assert and class templates

我对 static_assert 功能有疑问。当我直接实例化一个 class 模板时,一切都按预期进行。但是当我将它作为参数传递给不同的 class 模板时,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>;
};

但这是不正确的。

您的 class 模板 B 未对其 T 执行任何操作,因此未实例化其 T

因此"nothing happens"到B<A<1>>中的A<1>

如果您在 B 中有一个成员 T a,那么您将得到断言失败。

对于B<A<1>> b;A<1>仅用作模板参数,不会导致class模板Aimplicit instantiation,然后static_assertA 的定义中不会被触发。

When code refers to a template in context that requires a completely defined type, or when the completeness of the type affects the code, and this particular type has not been explicitly instantiated, implicit instantiation occurs. For example, when an object of this type is constructed, but not when a pointer to this type is constructed.

另一方面,对于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");
};