为什么不能使用 rvalue 来初始化 lvalue 引用
Why a rvalue cannot be used to initialize a lvalue reference?
我可以做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。
因此,左值引用将传播对右值"初始化"的任何访问。
即,您将尝试访问像左值这样的右值表达式。
并非在所有情况下都像左值一样访问右值。
这就是原因。
右值是暂时的 - 它很快就会死去。创建对此类对象的左值引用将会导致灾难,因为该引用将很快成为对死对象的悬而未决的引用。
相关文章:
- 是否可以初始化不可复制类型的成员变量(或基类)
- C++使用整数的压缩数组初始化对象
- C++初始化基类
- 多成员Constexpr结构初始化
- 复制列表初始化的隐式转换的等级是多少
- 内联映射初始化的动态atexit析构函数崩溃
- 如何在C++中初始化嵌套类中的2个memeber
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- 没有用于初始化C++中的变量模板的匹配构造函数
- 在未初始化映射的情况下,将值插入到映射的映射中
- C++成员初始化
- 为什么在C++中首先初始化成员类
- 同时具有"聚合初始化"和"模板推导"
- 初始化具有非默认构造函数的std::数组项的更好方法
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 在C和C++中初始化结构中的数组
- 为什么不能使用 rvalue 来初始化 lvalue 引用
- C++:无法使用条件类型在模板函数中使用 'double' 类型的 lvalue 初始化 'char*' 类型的参数
- 从大括号括起来的初始值设定项列表进行的Lvalue引用初始化无法编译