看下面的代码:
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 的编译器?毕竟,这似乎是未来更好的形式。