Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 右值引用是否与左值引用一样工作?_C++ - Fatal编程技术网

C++ 右值引用是否与左值引用一样工作?

C++ 右值引用是否与左值引用一样工作?,c++,C++,我想知道我的假设是否正确->右值引用与左值引用一样工作,只是它们只能绑定到右值,因此可以用于检测右值 因此,当用作返回类型时,它就像左值引用一样工作,就像它们返回绑定到的实际对象一样 当用作参数类型时,它们传递值而不进行任何复制 我看到很多人问按右值引用和按值(以及按左值引用)返回之间有什么区别,但他们不能都回答说右值引用与左值引用类似,所以如果你知道使用左值引用时会发生什么,你可能知道使用右值引用时会发生什么,也就是说,您会知道,按右值引用返回返回实际对象,而按值返回返回一个副本,就像按左值引

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

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

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

我看到很多人问按右值引用和按值(以及按左值引用)返回之间有什么区别,但他们不能都回答说右值引用与左值引用类似,所以如果你知道使用左值引用时会发生什么,你可能知道使用右值引用时会发生什么,也就是说,您会知道,按右值引用返回返回实际对象,而按值返回返回一个副本,就像按左值引用返回和按值返回之间的差异一样(大致)


还是我错了?

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

当读取任何对象时,都将其视为l值引用

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


其他一切都是如此。

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

Matrix operator+(const Matrix& lhs, const Matrix& rhs) {
    auto r = lhs;
    r += rhs;
    return r;
}
一些矩阵加法函数的典型特征。但是利用右值引用,我们可以开始添加如下重载:

Matrix&& operator+(Matrix&& lhs, const Matrix& rhs) {
    lhs += rhs;
    return lhs;
}

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

我认为这是一个很好的摘要。我不清楚您是否意识到将引用(左值或右值)返回到局部(堆栈)变量将返回一个悬空引用,导致未定义的行为。返回r值参考可防止RVO,因此是一种悲观情绪(以及潜在危险)@RichardCriten,我知道:)如果局部对象具有自动存储,并且会在return语句中被销毁,那么这也很有意义。@richardhoges我认为您假设函数正在返回局部变量。如果函数返回对输入或成员变量的引用(如果是对象方法),那么r值引用可能是最快的,尽管仍然有潜在的危险。如果没有复制省略,那会很酷,但我们有。所以这完全没有必要。在这种情况下,我们应该传递并返回副本。我不能说17,但在14和之前返回副本并不总是具有相同的效果。当您将多个函数调用链接在一起时,您可以看到这一点。例如,复制省略往往只在一层深度工作。@RichardHodges这是用1z编译的:。如果您认为该程序没有清楚地显示通过右值引用传递/返回可以节省通过值传递/返回的移动,请解释。是的,我知道,有一个优化嵌套操作的机会(例如,
w=x+y+z
),但要以维护开销为代价。您所说的“实型”是什么意思?@FacPam我是指声明中提到的类型。例如X、X&或X&&。当读取这些类型的任何名称时,都是X&