関数および暗黙の移動ルールからの値によって名前付きオブジェクトを返す
ジェネリック クラスのオブジェクトが次の関数によって返される状況を考えてみましょう。関数からの値。例 1:
出力は次のとおりです:
この例では、関数で作成した LValue オブジェクトに対してコンストラクター test() が呼び出され、moveコンストラクタ test(test&& s) は、式 return i が右辺値参照であるため、オブジェクト i が値によって返されるときに呼び出されます。
例 2 では、コピー コンストラクタ test(test& z) が提供されていますが、 move コンストラクターはコンパイラによって合成されません:
出力は例 1 と同じままです:
使用可能な move コンストラクターがないため、コピー コンストラクターが使用されます。
例 3 では、移動コンストラクターが明示的に削除されています。
削除された移動コンストラクターは移動操作を実行できないことを意味するため、このコードをコンパイルしようとするとエラーが発生します。 .
例 4 では、移動コンストラクターが削除されていても、コードはコンパイルされて実行されます。
出力:
この例では、r (u) オブジェクト u をコピーして新しいオブジェクト r を作成します。移動コンストラクターは削除されているため使用されず、代わりにコピー コンストラクターが使用されます。
重要な点は、移動コンストラクターが使用されるかどうかは、実行可能な移動コンストラクターの可用性と、そのルールに依存するということです。オーバーロードの解決。 move コンストラクターが利用可能で実行可能な場合は、値を返すために使用される式が LValue であっても、それを関数からの戻り値の初期化に使用できます。
以上がC で名前付きオブジェクトを値で返すために Move コンストラクターが使用されるのはどのような場合ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。