为什么 C++ 右值不是不可变的

why c++ rvalue is not immutable

代码:

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

并执行:

test(0);

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

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

int&& a = 0;

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

当你调用test(0)时,同样的规则适用,引用参数绑定到一个临时的;临时值递增,你得到结果 1。当然你不会递增 0 本身。

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

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