コピー コンストラクターとムーブ コンストラクター、および関数を含むオブジェクト 'foo' があるとします。
foo f() {
foo bar;
/* do some work */
return bar;
}
標準では、コンパイラが次のことを試みると述べているようです。NRVO、右辺値参照による戻り、値による戻り、失敗。その順序で。
私のコピーコンストラクターは非常に高価なので、コンパイラーが値を返さないようにする方法はありますか?
コピー コンストラクターとムーブ コンストラクター、および関数を含むオブジェクト 'foo' があるとします。
foo f() {
foo bar;
/* do some work */
return bar;
}
標準では、コンパイラが次のことを試みると述べているようです。NRVO、右辺値参照による戻り、値による戻り、失敗。その順序で。
私のコピーコンストラクターは非常に高価なので、コンパイラーが値を返さないようにする方法はありますか?
コンパイラは次のことを試みます: NRVO、右辺値参照による戻り、値による戻り、失敗; その順序で。
上記の文言は不正確であり、あなたの誤解を示している可能性があります。コンパイラはNRVO を使用できます (ほとんどの場合)。それが使用できない場合は、常に値によって返されます。違いは、返された値がどのように構築されるかです。型に移動コンストラクターがある場合、コンパイラはそのコンストラクターを使用する必要があり、型に移動コンストラクターがない場合にのみコピー コンストラクターを使用するようになります。
つまり、型に移動コンストラクターがある場合、コピー コンストラクターを使用するコンパイラは C++11 に準拠していません。
foo
移動コンストラクターが機能している場合、コードはコピーによって返されることはありません。
返す代わりに out-parameter を使用することもできます。
void f(foo& bar) { ... }
しかし実際には、すべてのコンパイラがNVROを実行します。