繁体   English   中英

返回const引用和rvalue引用之间的区别

[英]Difference between returning a const reference and rvalue reference

如果我没错,我认为const引用和rvalue引用都可以绑定到rvalue。 返回前者的函数和返回后者的函数之间是否存在实际差异?

编辑。 我不能修改前者,但为什么我有兴趣修改右值? 是否有意义?

const lvalue引用可以绑定到任何东西。 右值参考可以仅结合非const右值。

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

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

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

如果结果类型是左值引用类型或对函数类型的右值引用,则函数调用是左值;如果结果类型是对象类型的右值引用,则为xvalue,否则为prvalue。

至于何时你想要修改一个右值 - 这正是移动语义的全部意义所在。 考虑以下函数调用:

void func(std::string);

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

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

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

  • 当您想要访问读取“内部”对象(可能是类的成员)但不允许人们修改它时,最常使用返回const左值引用。

  • 当你想允许调用代码从“内部”对象(可能是类的成员)移动时,返回rvalue引用是最常用的(根本不常见)。 因此,它们不是从临时返回的对象移动(就像通过值返回时那样),而是从内部对象移动。

    这也可以用非实现const左值的参考,但随后他们将有明确std::move它。

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

不是说std::forward的返回类型看起来像T&& 但是,这具有欺骗性,因为根据T的类型,它可能是也可能不是rvalue引用。 通用参考文献

返回前者的函数和返回后者的函数之间是否存在实际差异?

这个问题似乎是不正确的。 返回常量lvalue-reference的函数提供对只读取的对象的访问权限,而返回rvalue-reference的函数提供移动访问权限,这意味着调用者可以获取引用对象的内容并将其移动到不同的宾语。 它们无论如何都无法比拟。

在这两种情况下,引用必须指向一个对象,其生命周期超出返回它的函数的末尾,否则调用者将在使用该引用时以未定义的行为跳转。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM