我想知道我的假设是否正确,-> Rvalue引用就像左值引用一样工作,除了它们只能绑定到Rvalue,因此它们可以用来检测Rvalue。
因此,当用作返回类型时,它的工作方式就像左值引用一样,就像它们返回绑定到的实际对象一样。
当用作参数类型时,它们无需任何复制即可传递值。
我看到很多人在问按右值引用和按值(以及按左值引用)返回的区别是什么,但不能通过说右值引用像左值引用一样工作,所以如果你知道使用左值引用时会发生什么,你可能就知道使用右值引用时会发生什么,即你会知道按右值引用返回实际对象,而按值返回一个副本,就像按左值引用和按值返回(粗略地)的区别一样?
还是我错了?
发布于 2017-07-16 20:41:10
当任何命名对象被写入时,它被视为它的真实类型。
当读取任何对象时,它被视为一个l值引用。
从函数返回的对象没有名称,因此它被视为其真实类型。
其他的一切都是由此而来的。
发布于 2017-07-16 20:52:33
至于使用右值引用作为返回类型,它通常类似于左值引用,即你通常不应该这样做,因为你不能返回对局部变量的引用。但是,输入和输出中的rvalue引用的组合实现了一些有趣的功能:
Matrix operator+(const Matrix& lhs, const Matrix& rhs) {
auto r = lhs;
r += rhs;
return r;
}
一些矩阵加法函数的典型签名。但是利用rvalue引用,我们可以像这样开始添加重载:
Matrix&& operator+(Matrix&& lhs, const Matrix& rhs) {
lhs += rhs;
return lhs;
}
第二个版本是整洁的,因为没有副本,甚至没有任何移动!对于左值引用,这是不可行的,因为你不能确定你可以继续使用/滥用输入的存储。因此,右值引用确实打开了一些通过引用返回的新机会,但它仍然是例外,而不是常态。
https://stackoverflow.com/questions/45127959
复制相似问题