【发布时间】:2011-10-26 03:20:15
【问题描述】:
看下面的代码:
class MyClass{
public:
MyClass(){}
MyClass(MyClass &&){}
MyClass(const MyClass &){}
};
MyClass f1(){
MyClass &&o=MyClass();
/*...*/
return std::move(o);//or return static_cast<MyClass &&>(o);
}
MyClass f2(){
MyClass o=MyClass();
/*...*/
return o;
}
int main(int, char **){
auto a=f1();
auto b=f2();
}
函数f2是返回对象的正常形式。 NRVO 可能适用,并且可以避免额外的复制构造函数调用。 f1 是使用右值引用的新形式。对于不支持 NRVO 但支持右值引用的系统,调用的是移动构造函数而不是复制构造函数,这在大多数情况下会被认为更好。
f1的问题是:在这种情况下有没有支持NRVO的编译器?毕竟这似乎是未来更好的形式。
【问题讨论】:
-
"对于不支持 NRVO 但支持右值引用的系统" 我强烈怀疑这样的系统实际上并不存在。我想确认一下。
-
ooohhh... “哪个更好?” - 这是一个决定性地结束所有“哪个更好,a还是b?”的问题。问题,对吗??? (提示:选择一个更具描述性的标题)
-
C++11 的设计者们竭尽全力让最明显的代码也成为最好的代码。见stackoverflow.com/questions/4986673/…。
标签: c++ c++11 rvalue-reference nrvo