【问题标题】:Why is rvalue references considered safer than lvalue references?为什么右值引用被认为比左值引用更安全?
【发布时间】:2017-07-07 18:46:26
【问题描述】:

在 C++11 之前,只有 const 左值引用可以绑定到右值,因为右值引用不存在,非 const 左值引用不能绑定到右值。 afaik,非 const 左值引用不能绑定到右值的原因是它很危险。因此,他们制作了右值引用,这使得移动数据成为可能……但为什么右值引用绑定到右值被认为比绑定到右值的非 const 左值引用更安全?

【问题讨论】:

  • 你是在说std::move()的原因吗?
  • 就像 const 左值引用一样,右值引用延长了它们所指对象的生命周期。非 const 左值引用不显示此属性。

标签: c++


【解决方案1】:

右值引用相对于左值引用的优势在于,通过右值引用,您知道所引用的对象是一个右值。因此,您知道您可以在不损坏其他数据的情况下对其进行操作。

如果允许非 const 左值引用引用右值,您将永远不会知道引用的对象是否是临时的。例如,考虑这两个构造函数

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
    }
};

即使允许左值引用引用右值,您在第二个版本中可以获得的性能优势也无法在第一个版本中实现。

【讨论】:

  • 啊这都是因为“安全”?事实上,他们可以为非常量左值引用添加与右值引用相同的功能,但是他们禁止非常量左值引用的这种用法,因为它太不安全了?如果是这样,他们不能只允许非常量左值引用绑定到右值并让用户负责正确使用它吗?那么他们甚至不必创建另一个引用类型(右值引用)?
  • 这不是正确使用它的问题。通过允许右值引用对所引用的对象进行一些破坏性操作,有时可以实现性能优势。我将编辑我的回复以反映这一点。
  • 嗯嗯嗯.. 但是非 const 左值引用不能实现同样的效果,比如移动部分吗?
  • 没有。我已经更新了我的答案。您需要一些方法来区分作为左值的 src 和作为右值的 src
  • 是的,现在它对我来说更有意义了。然而,除了能够区分右值和左值之外,真的没有什么是非 const 左值引用(如果允许绑定到右值)不能做到右值引用可以做的,对吗?如果是这样,区分部分是创建右值引用的原因吗?
猜你喜欢
  • 1970-01-01
  • 2015-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-15
  • 1970-01-01
  • 2018-01-13
  • 1970-01-01
相关资源
最近更新 更多