static_assert失败检查模板化对象指针

cre*_*ire 2 c++ templates static-assert assertions c++11

template <size_t N>
class Foo
{
    static_assert(N > 0, "WRONG");
    //void Something() = 0; //my original implementation
};

int main() {

    Foo<0> *p2 = nullptr;   //no error
    Foo<0> p;   //gives an error

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我已分别测试了两条线.初始化p2时不调用static_assert但是它被调用并确实在p上失败.这是有意的吗?(我在gcc,clang和VC上尝试过)

解决方法有哪些?由于我正在使用抽象模板化类,如果断言仅在实例化非指针对象时执行,那将是一场噩梦.我可以使用工厂,但这不是一个合适的解决方案.

Col*_*mbo 6

你确实看到了§14.7.1/ 1的引用:

除非已经显式实例化了类模板特化(14.7.2)或显式专用(14.7.3),否则在需要完全定义的对象类型或完整性的上下文中引用特时,将隐式实例化类模板特化.类类型会影响程序的语义.

指针类型不要求它们的指针成为完整类型(void*例如,这是一个例子).因此第一行不会实例化专门化,但第二行需要,因此断言仅在该行上触发.

这也通过以下三段进一步说明:

[ 例如:

template<class T> struct Z {
  void f();
  void g();
};

void h() {
  Z<int> a;      // instantiation of class Z<int> required
  Z<double>* q;  // instantiation of class Z<double> not required
  //[…]
}
Run Code Online (Sandbox Code Playgroud)

此示例中的任何内容都不需要Z<double>隐式实例化类[...].- 结束例子 ]