代码:
void test(int&& a)
{
a++;
std::cout << a << std::endl;
}
并执行:
test(0);
为什么输出1?因为我认为0是右值,它无法改变。
答案 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;