【问题标题】:static_assert and class templatesstatic_assert 和类模板
【发布时间】:2017-05-03 13:53:36
【问题描述】:

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

但这是不正确的。

【问题讨论】:

  • B&lt;T&gt; 从不实例化 T。静态断言仅在模板特化被实例化时触发。
  • @KerrekSB: ↓↓↓↓↓↓↓

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


【解决方案1】:

对于B&lt;A&lt;1&gt;&gt; b;A&lt;1&gt;只作为模板参数,不会导致类模板Aimplicit instantiation,那么A的定义里面的static_assert就不会被触发.

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

另一方面,对于A&lt;1&gt; a;A&lt;1&gt; 需要是一个完整的类型(以构造a),然后发生隐式实例化,static_assert 被触发。

编辑

您可以使用sizeof(要求类型完整)来引发隐式实例化并触发static_assert。例如

template <class T>
class B{
    static_assert(sizeof(T) > 0, "static_assert for implicit instantiation");
};

【讨论】:

  • 有没有办法在 B 的主体中显式实例化 A 模板类而不创建 A 实例/从 A 继承?我确实知道这种语法:模板类 A;但是我不能在B体中使用这个。
  • @valentin 答案已修改。
【解决方案2】:

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

因此,A&lt;1&gt;B&lt;A&lt;1&gt;&gt; 中“没有任何反应”。

如果你在B 中有一个成员T a,那么你会遇到断言失败。

【讨论】:

    猜你喜欢
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 2021-06-14
    • 1970-01-01
    • 2023-01-10
    • 2013-07-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多