当你使用std :: move返回时,"return-by-rvalue-ref"和"return-by-value"之间的区别?

Ben*_*ahi 9 c++ rvalue rvalue-reference c++11

考虑以下代码:

#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();
}
Run Code Online (Sandbox Code Playgroud)

C包含I.而C :: foo()允许你将我移出C.上面使用的成员函数有什么区别:

I&& foo() { return move(i) }; // return rvalue ref
Run Code Online (Sandbox Code Playgroud)

和以下替换成员函数:

I foo() { return move(i) }; // return by value
Run Code Online (Sandbox Code Playgroud)

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

这个例子中没有涉及到什么后果?

And*_*owl 6

关于你编写的程序是否有意义的考虑(从数据成员转移是很尴尬 - 但好吧,也许有一些用例),在这种情况下,该函数的两个版本最终做同样的事情.

但是,作为一般惯例,您应该更喜欢按值返回,因为在许多情况下,它允许编译器执行复制省略忽略对返回类型的移动构造函数的调用,如C++第12.8/31段所允许的那样11标准.

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

因此,作为一般准则,更喜欢按价值返回.