当然,这不会编译:
int &z = 3; // error: invalid initialization of non-const reference ....
这将编译:
const int &z = 3; // OK
现在,考虑一下:
const int y = 3;
int && yrr = y; // const error (as you would expect)
int && yrr = move(y); // const error (as you would expect)
但是这些下一行确实为我编译。我认为不应该。
int && w = 3;
int && yrr = move(3);
void bar(int && x) {x = 10;}
bar(3);
最后两行不会允许文字3被修改吗? 3
和const int之间有什么区别?最后,“修改”文字是否有任何危险?
(g ++ - 4.6(GCC)4.6.2 with -std=gnu++0x -Wall -Wextra
)
答案 0 :(得分:13)
对文字3
的右值引用:
int && w = 3;
实际上绑定到一个临时表,它是评估表达式3
的结果。它不受某些柏拉图文字3的约束。
(所有以下标准参考均来自2011年3月草案,n3242)
3.10 / 1“Lvalues and rvalues”
12,3.3e5或true等文字的值也是prvalue
然后8.5.3“引用”给出了引用如何约束的规则落到最后一个案例,其中说:
否则,将使用非引用复制初始化(8.5)的规则从初始化表达式创建并初始化类型为“cv1 T1”的临时类型。然后将引用绑定到临时。
并举一个非常接近你问题内容的例子:
double&& rrd = 2; // rrd refers to temporary with value 2.0