c++ - 返回 const 引用和右值引用之间的区别

标签 c++ c++11 rvalue-reference

如果我没记错的话,我认为 const 引用和右值引用都可以绑定(bind)到右值。返回前者的函数和返回后者的函数之间有什么实际区别吗?

编辑。我不能修改前者,但为什么我会对修改右值感兴趣?有道理吗?

最佳答案

const 左值引用可以绑定(bind)到任何东西。右值引用只能绑定(bind)到非 const 右值。

            non-const lvalue   const lvalue   non-const rvalue   const rvalue
const T&    yes                yes            yes                yes
T&&         no                 no             yes                no

如您所见,它们非常不同。

此外,如果函数调用返回左值引用,则该表达式为左值,但如果函数调用返回对象的右值引用,则该表达式为缺值。

A function call is an lvalue if the result type is an lvalue reference type or an rvalue reference to function type, an xvalue if the result type is an rvalue reference to object type, and a prvalue otherwise.

至于什么时候你想修改一个右值——好吧,这正是移动语义的全部内容。考虑以下函数调用:

void func(std::string);

func(std::string("Hello"));

表达式 std::string("Hello") 是一个创建临时对象的右值。当使用此右值初始化 std::string 参数时,它将选择采用右值引用的构造函数 - 移动构造函数。然后,此构造函数从右值中窃取内容,这通常比进行完整复制要快得多。我们可以从中窃取,因为我们知道它是暂时的。

至于何时应该返回 const 左值引用或右值引用:

  • 返回一个 const 左值引用最常用于当你想授予读取“内部”对象(可能是一个类的成员)但不允许人们修改的访问权限时

  • 当您希望允许调用代码从“内部”对象(可能是某个类的成员)移动时,返回右值引用是最常用的(一点也不常见)。因此,它们不是从临时返回的对象移动(就像按值返回时那样),而是从内部对象移动。

    这也可以通过非const 左值引用来实现,但是他们必须显式地std::move 它。

因此您不太可能需要返回右值引用。

不是那个std::forward有一个看起来像 T&& 的返回类型。然而,这是具有欺骗性的,因为它可能是也可能不是右值引用,具体取决于 T 的类型。参见 universal references .

关于c++ - 返回 const 引用和右值引用之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15681691/

相关文章:

c++ - 类静态变量初始化的规则是什么?

c++ - 尝试设置用户定义的消息处理程序时出现堆栈溢出(!)

c++ - 如何从 `auto` 变量推导出类型

c++ - 一个类只能继承一次

c++ - 编译问题: building a Composite_Key variadic template class using tuples

c++ - 右值引用模板推导

c++ - std::reference_wrapper 是否应该包含默认比较器 "<"运算符?

c++ - 左值引用和右值引用中的绑定(bind)错误

c++ - 为什么 std::move 将右值引用作为参数?

c++ - static_assert - 一种动态自定义错误消息的方法