Vin*_*ent 12 c++ class static-assert compile-time c++11
请考虑以下代码:
template <unsigned int N>
struct myclass
{
unsigned int f() {return N;}
unsigned int g() {static_assert(N > 0, ""); return N-1;}
};
Run Code Online (Sandbox Code Playgroud)
问题:我是否保证以下代码将编译:
myclass<0> c;
c.f();
Run Code Online (Sandbox Code Playgroud)
但以下不会:
myclass<0> c;
c.f();
c.g();
Run Code Online (Sandbox Code Playgroud)
Bar*_*rry 11
是的,你有这个保证.从[temp.inst]/11开始,强调我的:
实现不应隐式实例化函数模板,变量模板,成员模板, 非虚拟成员函数,成员类或不需要实例化的类模板的静态数据成员.
如果您不调用g(),则不需要实例化,因此调用时应该没有问题myclass<0>{}.f().
这是相同的保证,允许您使用std::vector和std::map不是默认可构造的类型,只要您不分别执行call resize()和operator[].
正如Jarod42所指出的那样,后续是显式实例化myclass<0>将产生断言因为,来自[temp.explicit]/8:
命名类模板特化的显式实例化也是其每个成员(不包括从基类继承的成员和作为模板的成员)的相同类型(声明或定义)的显式实例化,这些实例之前未明确专门化包含显式实例化的翻译单元,除非如下所述.
例外情况不适用于此处.
| 归档时间: |
|
| 查看次数: |
344 次 |
| 最近记录: |