考虑以下代码:
#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&&);的调用。
本例中未涉及的后果是什么?
发布于 2013-05-24 17:49:55
抛开你写的程序是否有实际意义的考虑(从数据成员转移是很尴尬的-但好吧,也许有一些用例),在这种情况下,该函数的两个版本最终做的是相同的事情。
但是,通常情况下,您应该更喜欢按值返回,因为在许多情况下,它允许编译器执行复制省略,并省略对返回类型的move构造函数的调用,这是C++11标准第12.8/31段所允许的。
复制省略允许编译器直接在对象中创建函数的返回值,该返回值应该从函数的返回值初始化。
因此,作为一般的指导原则,更喜欢按值返回。
https://stackoverflow.com/questions/16732090
复制相似问题