コンパイラが名前付き戻り値の最適化 (NRVO) を実行できるようにするには、戻り値を関数本体の他の値より前に宣言する必要があることを理解しています。これは、例外が発生した場合のスタックの巻き戻しの順序が原因であると思われますが、よくわかりません。名前付きの戻り値が関数本体で最初に宣言されなければならない理由は何ですか?
class C{};
C f(){
C ret; //NRVO possible
return ret;
}
C g(){
int i;
C ret; //NRVO not possible?
return ret;
}
使用事例:
auto c = f();
auto c2 = g();
編集: これを理解するのを手伝ってくれてありがとう、すべての回答者に感謝します。チャンドラー・カルースの声明がここにあると疑い始めています。それを誤解します。戻り変数を最初に宣言することは重要ではないようです。