我可以const A& a = A()
和A&& a = A()
,但为什么我不能A& a = A()
?
答案 0 :(得分:2)
理由是,改变一个临时的很少有意义。任何这样做的尝试都可能是编程错误而不是故意的决定。
原型示例如下。假设允许绑定到非const引用。
void foo(int& x, int& y); // sets x and y
int xx, yy;
foo(xx, yy); // xx and yy are set
// now make a small change...
void foo(long& x, long& y); // upgrade
int xx, yy; // forgot to change here
foo(xx, yy); // silently breaks
虽然人们有时想要改变一个临时的,但它通常与改变左值的完全不同。发明Rvalue引用是为了适应这些情况。
答案 1 :(得分:0)
通过“初始化左值参考”,您可以参考定义参考从那时开始引用的左值。
因此,左值引用将传播对右值“初始化”的任何访问
即你会尝试访问一个像左值这样的rvalue表达式
在所有情况下都不可能访问左值这样的右值。
这就是原因。
答案 2 :(得分:0)
右步是暂时的 - 它很快就要死了。创建对这样一个对象的左值引用将是灾难的一个方法,因为引用将很快成为对死对象的悬空引用。