首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >返回常量引用和右值引用的区别

返回常量引用和右值引用的区别
EN

Stack Overflow用户
提问于 2013-03-28 20:21:45
回答 2查看 5.8K关注 0票数 7

如果我没有错,我认为常量引用和右值引用都可以绑定到右值。返回前者的函数和返回后者的函数有什么实际区别吗?

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-28 20:23:44

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

代码语言:javascript
运行
复制
            non-const lvalue   const lvalue   non-const rvalue   const rvalue
const T&    yes                yes            yes                yes
T&&         no                 no             yes                no

正如你所看到的,它们是非常不同的。

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

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

至于什么时候你想要修改一个右值--这正是move语义的全部内容。考虑下面的函数调用:

代码语言:javascript
运行
复制
void func(std::string);

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

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

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

当您想要授予读取“内部”对象(可能是类的成员)的访问权限,但不允许人们修改it.

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

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

所以你不太可能需要返回一个右值引用。

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

票数 16
EN

Stack Overflow用户

发布于 2013-03-28 21:05:17

返回前者的函数和返回后者的函数有什么实际区别吗?

这个问题似乎有欠妥当。返回常量左值引用的函数提供对对象的访问,仅用于读取,而返回右值引用的函数提供移动访问,这意味着调用者可以获取所引用对象的内容并将其移动到不同的对象。它们无论如何都不具有可比性。

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15681691

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档