为什么不能使用 rvalue 来初始化 lvalue 引用

Why a rvalue cannot be used to initialize a lvalue reference?

本文关键字:初始化 lvalue 引用 rvalue 不能 为什么      更新时间:2023-10-16

我可以做const A& a = A()A&& a = A(),但为什么我不能做A& a = A()

理由是突变临时很少有意义。任何这样做的尝试都可能是编程错误,而不是故意的决定。

原型示例如下。假设允许绑定到非常量引用。

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

虽然人们有时确实想改变一个临时的,但这通常是出于与改变一个左值完全不同的原因。发明了右值参考以适应这些情况。

通过"初始化左值引用",您指的是定义从那时起引用所引用的 lavalue。
因此,左值引用将传播对右值"初始化"的任何访问。
即,您将尝试访问像左值这样的右值表达式。
并非在所有情况下都像左值一样访问右值。

这就是原因。

右值是暂时的 - 它很快就会死去。创建对此类对象的左值引用将会导致灾难,因为该引用将很快成为对死对象的悬而未决的引用。