为什么右值不能用于初始化左值引用?
Why a rvalue cannot be used to initialize a lvalue reference?
我可以const A& a = A()
和A&& a = A()
,但为什么我不能A& a = A()
?
通过"initialising an lvalue reference"你指的是定义从那时起引用所指的左值。
因此 lvalue-reference 将传播对右值 "initialisation".
的任何访问
IE。你会尝试像访问左值一样访问 rvalue-expression。
不可能在所有情况下都像访问左值一样访问右值。
这就是原因。
右值是临时的 - 它很快就会消亡。创建对此类对象的左值引用将是灾难的根源,因为该引用将很快成为对死对象的悬空引用。
理由是改变临时文件很少有意义。任何这样做的尝试都可能是编程错误,而不是故意的决定。
原型示例如下。假设允许绑定到 non-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
虽然有时确实想要改变临时值,但这通常是出于与改变左值完全不同的原因。发明了右值引用来适应这些情况。
我可以const A& a = A()
和A&& a = A()
,但为什么我不能A& a = A()
?
通过"initialising an lvalue reference"你指的是定义从那时起引用所指的左值。
因此 lvalue-reference 将传播对右值 "initialisation".
的任何访问
IE。你会尝试像访问左值一样访问 rvalue-expression。
不可能在所有情况下都像访问左值一样访问右值。
这就是原因。
右值是临时的 - 它很快就会消亡。创建对此类对象的左值引用将是灾难的根源,因为该引用将很快成为对死对象的悬空引用。
理由是改变临时文件很少有意义。任何这样做的尝试都可能是编程错误,而不是故意的决定。
原型示例如下。假设允许绑定到 non-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
虽然有时确实想要改变临时值,但这通常是出于与改变左值完全不同的原因。发明了右值引用来适应这些情况。