c++ - 使用 std::move 返回的"按右值引用返回"&"按数值返回值"之间的C++ 差异?

  显示原文与译文双语对照的内容

考虑以下代码:


#include <iostream>


using namespace std;



struct I {


 I(I&& rv) { cout <<"I::mvcotr" <<endl; }


};



struct C {


 I i;


 I&& foo() { return move(i) };


 }


};



int main() {


 C c;


 I i = c.foo();


}



C 包含我,而 C::foo() 允许你移动我离开。 上面使用的成员函数之间的区别是什么:


I&& foo() { return move(i) };//return rvalue ref



以及以下替换成员函数:


I foo() { return move(i) };//return by value



对我来说他们似乎做了同样的事情: I i = c.foo(); 导致对 I::I(I&&);的调用。

这个例子中没有涵盖的结果是什么?

时间: 原作者:

注意你写的程序是否实际上是有意义的( 从数据成员中移动很麻烦,但是很好,可能有一些用例),这种情况下这两个版本的功能结束了。

然而,一般情况下,你应该返回 value,因为很多情况下它允许编译器执行复制elision并省略返回类型的调用,如标准的第 12.8/31的。

复制省略允许编译器直接在应该从函数值返回的对象中创建函数的返回值。

因此,作为一般准则,prefer返回值

原作者:
...