a.l*_*ram 6 c++ templates c++11
为什么将局部变量用作非类型参数是非法的?
例如,在下一个代码local_var中不能参数X.
template<int& x> struct X {};
void f(int local_var)
{
X<local_var> x;
}
Run Code Online (Sandbox Code Playgroud)
因为必须在编译时计算模板参数,并且编译器在运行时才知道局部变量的地址(为了绑定对象的引用,编译器需要知道该对象的地址).
请注意,C++ 11标准确切地说明了第14.3.2/1段中可以提供的非类型模板参数:
甲模板参数的用于非类型,非模板模板参数应是以下之一:
-对于非类型模板参数的类型的积分或枚举类型,转换后的常量表达式(5.19)的模板的参数 ; 要么
- 非类型模板参数的名称; 要么
- 一个常量表达式(5.19),用于指定具有静态存储持续时间和外部或内部链接的对象的地址,或具有外部或内部链接的函数,包括函数模板和函数模板ID,但不包括非静态类成员,表达(忽略括号)as&id-expression,除非如果名称引用函数或数组,则可以省略&,如果相应的template-parameter是引用,则省略; 要么
- 一个常量表达式,其值为空指针值(4.10); 要么
- 一个常量表达式,其值为null成员指针值(4.11); 要么
- 指向成员的指针,如5.3.1所述; 要么
- 类型的地址常量表达式
std::nullptr_t.
如您所见,局部变量不在此列表中.
| 归档时间: |
|
| 查看次数: |
474 次 |
| 最近记录: |