gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 18:10:56 24 4
gpt4 key购买 nike

如果我没记错的话,我认为 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com