次のコードを見てください。
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をサポートするコンパイラはありますか?やっぱり将来的にはもっといい形になりそうです。