局部变量作为非typename参数

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)

And*_*owl 6

因为必须在编译时计算模板参数,并且编译器在运行时才知道局部变量的地址(为了绑定对象的引用,编译器需要知道该对象的地址).

请注意,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.

如您所见,局部变量不在此列表中.

  • @Mehrdad:Andy引用的第三个项目符号明确排除了"本地"(块范围)变量,因为它们没有链接.请参见http://stackoverflow.com/questions/17348611/does-static-object-in-a-template-function-have-linkage/17350254#17350254 (2认同)