rvalue引用和函数的返回值

kee*_*lar 4 c++ function move rvalue-reference c++11

我是c ++ 11的新手,在阅读C++ 11 FAQ时遇到以下问题.

假设我们有一个函数f()返回一个类型的值X,那么我们有以下方法来存储它的返回值:

X a = f();    // copy assignment
X&& b = f();  // move assignment
Run Code Online (Sandbox Code Playgroud)

根据C++ FAQ,第二个避免了不必要的副本.

我的问题是:第二个总是接收函数调用返回值的首选方法吗?另外,auto c = f();相当于上述任务之一?谢谢.

Ker*_* SB 5

  1. 你写的所有内容都不是作业。所有代码段都声明并初始化一个新变量。

  2. auto a = f()是相同的X a = f()

  3. X && b是一个引用,而不是一个对象。

  4. 始终创建本地对象变量,即X a = f()永远不要创建右值引用。后者(几乎)从来没有充分的理由。无论哪种情况,您都会得到一个与变量一样长的对象,并且不需要额外的复杂性。


Jos*_*eld 5

您已错误地标记了这些行.它们都不是作业,更不用说分别复制和移动作业了.相反,第一个涉及复制/移动构造(取决于是否X具有移动构造函数),第二个是简单地初始化引用.

接收函数调用的返回值的首选方法是第一种方式:

X a = f();
Run Code Online (Sandbox Code Playgroud)

从临时返回f()到对象的副本a几乎肯定会被删除.这与auto c = f();将采用的形式相同.

第二个应该很少(如果有的话)出现在你的代码中.您正在对返回类型进行右值引用f().Stroustrup只是为了证明temporaries可以绑定到rvalue引用.当您调用具有右值引用参数类型的移动构造函数/赋值运算符时,这通常在实际代码中发生.