【发布时间】:2015-10-23 11:46:52
【问题描述】:
为什么非类型引用的模板参数不能是另一个引用(g++ 4.8.1):
template <int& N> void test() { }
int x = 5;
int& p = x;
int main(){
test<x>(); //compiles fine
test<p>(); //error: could not convert template argument 'p' to 'int&'|
}
我看不出标准 p 违反了什么规定,这些似乎是最相关的部分 (N3337):
[14.3.2] [.1] 非类型、非模板模板参数的模板参数应为以下之一:
——对于整数或枚举类型的非类型模板参数,模板参数类型的转换常量表达式(5.19);或
——非类型模板参数的名称;或
— 一个常量表达式 (5.19),它指定具有静态存储持续时间和外部或内部链接的对象或具有外部或内部链接的函数的地址,包括函数模板 和函数模板 ID,但不包括非静态类成员,表示(忽略括号)为 & id 表达式,但如果名称指代函数或数组,则 & 可以省略,如果对应的模板参数则应省略是参考;或者.....
[.4]
[ 注意:临时、未命名的左值和没有链接的命名左值是不可接受的模板参数 当对应的模板参数有引用类型时。
[.5]
- 对于对象类型引用的非类型模板参数,不适用任何转换。引用的类型 to by reference 可能比模板参数的(否则相同)类型更符合 cv 要求。 模板参数直接绑定到模板参数,它应该是一个 左值。
p 应该被视为左值,不是吗?我唯一能想到的另一件事可能是缺少引用链接,但添加extern int& p = x 也没有解决它。
【问题讨论】:
-
@JoachimPileborg 是的,这正是我在上面链接的问题中提到的建议。确定在这种情况下应用了哪些确切更改需要一点时间。前一个更简单,因为提案示例完全涵盖了 OP 案例。
标签: c++ templates c++11 reference non-type