为什么右值引用被认为比右值引用更安全?
Why is rvalue references considered safer than lvalue references?
在C++11之前,只有常量左值引用可以绑定到右值,因为右值引用不存在,非常量左值引用无法绑定到右值。afaik,非常量左值引用不能绑定到右值的原因是这将是危险的。因此,他们进行了右值引用,这使得移动数据成为可能......但是,为什么绑定到右值的右值引用被认为比绑定到右值的非常量右值引用更安全?
右值引用相对于左值引用的优点是,使用右值引用,您知道引用的对象是右值。因此,您知道您可以在不损坏其他数据的情况下对其进行操作。
如果允许非常量左值引用右值,您将永远不知道引用的对象是否是临时的。 例如,考虑这两个构造函数
class A {
public:
A(A& src) // Copy constructor
{
// Create a copy of src, but be sure to leave src intact
}
A(A&& src) // Move constructor
{
// Create a copy of src. If necessary, you can steal some
// of src's resources (dynamic memory, open files). It
// won't miss it
}
};
在第二个版本中可以获得的性能优势无法在第一个版本中实现,即使允许左值引用引用右值也是如此。
相关文章:
- 线程安全的引用计数队列C++
- 将常量引用成员设置为临时变量是否安全
- 为什么引用比指针更安全?
- 为什么右值引用被认为比右值引用更安全?
- 这安全吗?右值和引用返回值
- std::串联的字符串引用是安全的
- 在 C++ 中更改越界指针的取消引用是否安全?
- 通过引用从 c++ 函数异常返回对象是否安全
- 通过引用返回共享对象是否安全"std::lock_guard<mutex>"?
- 返回强制引用是否安全
- 将 const 引用传递给临时字符串对象在 C++ 中安全吗?
- 有没有更好/安全的方法将shared_ptr的非常量引用强制转换为基类
- 检查指针是否为null,然后在同一if语句中取消引用它,这样安全吗
- 取消引用指向不同线程中的原子对象的只读非原子指针是否安全
- 对 std::atomic::load 的结果使用结构取消引用 (->) 运算符是否安全
- C++中的安全指针取消引用
- 初始值设定项列表引用类型安全
- 以这种方式返回对新创建的对象的引用,这是一种安全的做法
- 通过make_unique取消引用下转换的派生对象是否安全
- 对end()解引用安全吗?