为什么 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;
代码:
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;