これは通常、特別なルールがなくてもtemp
、関数の戻り値へのコピーになります。ただし、標準には、これを改善することを目的とした 2 つの規則があります。1 つ目は、コピーが省略される可能性があることです (12.8/31):
クラスの戻り値の型を持つ関数の return ステートメントで、式が関数の戻り値の型と同じ cvunqualified 型を持つ不揮発性自動オブジェクト (関数または catch-clause パラメーター以外) の名前である場合、コピー/move 操作は、自動オブジェクトを関数の戻り値に直接構築することで省略できます
これは、戻り値の最適化 (RVO) の特殊なケースである名前付き戻り値の最適化 (NRVO) としてよく知られています。
2 つ目は、この状況が上記のコピー省略の基準を満たしているため、最初に移動と見なされることです (12.8/32)。
コピー操作の省略の基準が満たされているか、ソース オブジェクトが関数パラメーターであり、コピーされるオブジェクトが左辺値によって指定されているという事実を除いて満たされる場合、コピーのコンストラクターを選択するためのオーバーロードの解決は次のとおりです。オブジェクトが右辺値によって指定されたかのように最初に実行されます。
そのため、コンパイラは次の手順を試みます。
- クラスに移動コンストラクターはありますか?
- もしそうなら、それを移動するか、移動を省略します。
- そうでない場合、クラスにはコピー コンストラクターがありますか?
- もしそうなら、それを移動するか、コピーを削除してください。
- そうでない場合、このオブジェクトをコピーまたは移動できません。
移動またはコピーが省略されている場合でも、これが機能するには、クラスに移動またはコピー コンストラクターが必要であることに注意してください。