为什么c ++ rvalue不是不可变的

时间:2015-02-14 04:47:26

标签: c++ lvalue rvalue

代码:

void test(int&& a)
{
    a++;
    std::cout << a << std::endl;
}

并执行:

test(0);

为什么输出1?因为我认为0是右值,它无法改变。

2 个答案:

答案 0 :(得分:5)

如果将非类非数组prvalue(例如数字文字)绑定到引用,则引用实际上将绑定到临时变量,它是原始副本的副本值。也就是说,

int&& a = 0;

创建一个值为零的临时int对象,然后将a绑定到该对象。

当您致电test(0)时,适用相同的规则,并且参考参数绑定到临时参数;临时增加,你得到结果1.当然你不会增加0本身。

答案 1 :(得分:1)

对const的rvalue引用和左值引用都可以绑定到临时值。不同的是,前者是可修改的,后者则不是。

int& i = 0; // invalid
const int& i = 0; // valid
++i; // invalid
int&& i = 0; //valid
++i; // valid;