首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >右值引用和左值引用一样工作吗?

右值引用和左值引用一样工作吗?
EN

Stack Overflow用户
提问于 2017-07-16 19:20:15
回答 2查看 87关注 0票数 3

我想知道我的假设是否正确,-> Rvalue引用就像左值引用一样工作,除了它们只能绑定到Rvalue,因此它们可以用来检测Rvalue。

因此,当用作返回类型时,它的工作方式就像左值引用一样,就像它们返回绑定到的实际对象一样。

当用作参数类型时,它们无需任何复制即可传递值。

我看到很多人在问按右值引用和按值(以及按左值引用)返回的区别是什么,但不能通过说右值引用像左值引用一样工作,所以如果你知道使用左值引用时会发生什么,你可能就知道使用右值引用时会发生什么,即你会知道按右值引用返回实际对象,而按值返回一个副本,就像按左值引用和按值返回(粗略地)的区别一样?

还是我错了?

EN

回答 2

Stack Overflow用户

发布于 2017-07-16 20:41:10

当任何命名对象被写入时,它被视为它的真实类型。

当读取任何对象时,它被视为一个l值引用。

从函数返回的对象没有名称,因此它被视为其真实类型。

其他的一切都是由此而来的。

票数 1
EN

Stack Overflow用户

发布于 2017-07-16 20:52:33

至于使用右值引用作为返回类型,它通常类似于左值引用,即你通常不应该这样做,因为你不能返回对局部变量的引用。但是,输入和输出中的rvalue引用的组合实现了一些有趣的功能:

代码语言:javascript
运行
复制
Matrix operator+(const Matrix& lhs, const Matrix& rhs) {
    auto r = lhs;
    r += rhs;
    return r;
}

一些矩阵加法函数的典型签名。但是利用rvalue引用,我们可以像这样开始添加重载:

代码语言:javascript
运行
复制
Matrix&& operator+(Matrix&& lhs, const Matrix& rhs) {
    lhs += rhs;
    return lhs;
}

第二个版本是整洁的,因为没有副本,甚至没有任何移动!对于左值引用,这是不可行的,因为你不能确定你可以继续使用/滥用输入的存储。因此,右值引用确实打开了一些通过引用返回的新机会,但它仍然是例外,而不是常态。

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

https://stackoverflow.com/questions/45127959

复制
相关文章

相似问题

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