" rvalue-ref"之间的差异&安培; "返回按值"当你使用std :: move返回时?

时间:2013-05-24 09:47:20

标签: c++ c++11 rvalue-reference rvalue

考虑以下代码:

#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包含I.而C :: foo()允许你将我移出C.上面使用的成员函数有什么区别:

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

以及以下替换成员函数:

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

对我而言,他们似乎做同样的事情:I i = c.foo();会调用I::I(I&&);

本例中未涵盖哪些后果?

1 个答案:

答案 0 :(得分:6)

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

但是,作为一般惯例,您应该更喜欢按值返回,因为在许多情况下,它允许编译器执行 copy elision 并且在允许的情况下忽略对返回类型的move构造函数的调用根据C ++ 11标准的第12.8 / 31段。

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

因此,作为一般准则,更愿意按价值返回