(N)RVO は、戻り値が新しい変数に代入されるときに一時オブジェクトの不要なコピーと作成を回避するのに役立ちます (したがって、コピー コンストラクターを回避します)。
したがって、次のようなものは RVO で最適化する必要があります。
MyObj getMyObj() {
return MyObj();
}
MyObj myobj = getMyObj();
しかし、呼び出しサイト オブジェクトが既に存在する場合にも発生しますか? (=
つまり、コピー コンストラクターの代わりに演算子が使用される場合)。私はこれに関する文献を見つけようとしましたが、(N)RVO は常にコピー コンストラクターを回避するという観点から説明されているようです。この場合、呼び出しサイト オブジェクトを変更しても実際に安全かどうかはわかりません。
MyObj myobj;
//will getMyObj() first create a temporary object and then copy it via the = operator?
myobj = getMyObj();