右值引用是否像左值引用一样工作?

时间:2017-07-16 11:20:15

标签: c++

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

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

当用作参数类型时,它们传递值而不进行任何复制。

我看到很多人都在质疑通过右值引用和值(以及左值引用)返回之间有什么区别,但是不能通过说rvalue引用就像左值引用一样来回答它们,所以如果你知道使用左值引用时会发生什么,你可能知道在使用右值引用时会发生什么,也就是说你会知道通过rvalue引用返回返回实际对象,而返回值返回一个副本,就像返回lvalue引用和返回之间的差异一样值(大致)?

或者我错了?

2 个答案:

答案 0 :(得分:1)

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

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

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

其他所有内容都来自于此。

答案 1 :(得分:-1)

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

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;
}

第二个版本很整洁,因为没有副本,甚至没有任何动作!这对于左值引用来说并不是真的可行,因为您无法确定是否可以继续使用/滥用输入的存储。所以左值引用确实为参考回报提供了一些新的机会,但它仍然是例外,而不是常态。