下面的示例尝试使用引用类型的变量作为非类型模板参数(本身为引用类型)的参数.Clang,GCC和VC++都拒绝它.但为什么?我似乎无法在标准中发现任何使其成为非法的内容.
int obj = 42;
int& ref = obj;
template <int& param> class X {};
int main()
{
X<obj> x1; // OK
X<ref> x2; // error
}
Run Code Online (Sandbox Code Playgroud)
克朗说:
source_file.cpp:9:7:错误:引用类型'int&'的非类型模板参数不是对象
其他人以类似的方式抱怨.
从标准(C++ 11的所有引用; C++ 14似乎没有相关部分的重大变化):
14.3.2/1甲模板参数的用于非类型,非模板模板参数应是以下之一:
...
- 一个常量表达式(5.19),用于指定具有静态存储持续时间和外部或内部链接的对象的地址...表示(忽略括号)为
&id-expression,但&如果相应的模板参数将被省略... 是一个参考...
现在什么是常量表达式:
5.19/2甲条件表达式是一个核心常量表达式除非它涉及以下作为一个潜在的评价子表达式(3.2)中的一个...
...
- 一个id-expression,它引用引用类型的变量或数据成员,除非引用具有先前的初始化,并使用常量表达式初始化
...
据我所知,refin X<ref>是一个id-expression,它引用了一个引用类型的变量.此变量具有先前的初始化,使用表达式初始化obj.我相信obj是一个不变的表达式,无论如何,如果不是,那么X<obj>也不应该编译.
X<ref> …