字面数字是否可变?

时间:2011-12-22 01:35:14

标签: c++ c++11 const rvalue-reference

当然,这不会编译:

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

1 个答案:

答案 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