12.8クラスオブジェクトのコピーと移動[class.copy]§31と§32は次のように述べています。
クラスreturn型を持つ関数のreturnステートメントで、式が関数return型と同じcv-unqualified型を持つ不揮発性自動オブジェクト(関数またはcatch-clauseパラメーター以外)の名前である場合、自動オブジェクトを関数の戻り値に直接構築することにより、コピー/移動操作を省略できます。
ソースオブジェクトが関数パラメーターであり、コピーされるオブジェクトが左辺値で指定されていることを除いて、コピー操作の省略基準が満たされている、または満たされる場合、コピーのコンストラクターを選択するためのオーバーロード解決は次のようになります。最初は、オブジェクトが右辺値で指定されているかのように実行されます。
したがって、次のように書くことができます。
unique_ptr<int> make_answer()
{
unique_ptr<int> result(new int(42));
return result; // lvalue is implicitly treated as rvalue
}
ただし、g ++ 4.6.3は、名前ではない左辺値も受け入れることに気付きました。次に例を示します。
return (result);
return *&result;
return true ? result : result;
対照的に、return rand() ? result : result;
動作しません。コンパイラのオプティマイザが言語のセマンティクスに干渉していませんか?私が標準を解釈するとき、は名前ではなく括弧で囲まれた式であるreturn (result);
ため、コンパイルしないでください。(result)
私は正しいですか、それとも間違っていますか?