10

考虑以下代码:

#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() 允许您将 I 从 C 中移出。上面使用的成员函数有什么区别:

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

以及以下替换成员函数:

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

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

本例未涵盖的后果是什么?

4

1 回答 1

7

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

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

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

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

于 2013-05-24T09:49:54.863 回答