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上尝试过)
解决方法有哪些?由于我正在使用抽象模板化类,如果断言仅在实例化非指针对象时执行,那将是一场噩梦.我可以使用工厂,但这不是一个合适的解决方案.
你确实看到了§14.7.1/ 1的引用:
除非已经显式实例化了类模板特化(14.7.2)或显式专用(14.7.3),否则在需要完全定义的对象类型或完整性的上下文中引用特化时,将隐式实例化类模板特化.类类型会影响程序的语义.
指针类型不要求它们的指针成为完整类型(void*例如,这是一个例子).因此第一行不会实例化专门化,但第二行需要,因此断言仅在该行上触发.
这也通过以下三段进一步说明:
[ 例如:
Run Code Online (Sandbox Code Playgroud)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 //[…] }此示例中的任何内容都不需要
Z<double>隐式实例化类[...].- 结束例子 ]