暗黙的な移動ルールを使用して値によってクラス オブジェクトを返す
関数から値によってクラスのオブジェクトを返す場合、暗黙的な移動ルールが適用されます。このルールは、返されたオブジェクトを初期化するためにどのコンストラクターを使用するかを決定します。通常、オブジェクトが xvalue (移動元の式) であるとみなされる場合は、移動コンストラクターが推奨されます。
例 1 では、変数 i は Some_thing() で宣言されています。 function はローカル スコープで宣言されており、移動対象とみなされているため、xvalue です。したがって、出力に示すように、移動コンストラクター test(test&& s) が呼び出されます。
ただし、例 2 では、移動コンストラクターを削除し、コピー コンストラクターを test に変更しました。 (テスト&z)。この変更により、出力には、暗黙的な移動ルールにより予期されていた、移動コンストラクターではなくコピー コンストラクター test(test& z) の呼び出しが表示されるようになりました。
この一見矛盾した動作は、i がまだ考慮されているために発生します。 xvalue ですが、コンパイラは「通常の」コピー コンストラクターも実行可能であるとみなします。暗黙的な移動ルールは最初に移動コンストラクターを使用しようとしますが、移動コンストラクターがないため、コピー コンストラクターの使用に進みます。
移動コンストラクターの使用を明示的に強制するには、コピー コンストラクターを削除できます。 例 3 に示すように。これにより、コンパイラーがコピー コンストラクターをオプションとして考慮することがなくなり、移動コンストラクターが const としてマークされている場合でも (通常は移動を禁止します) 使用されます。
例 4 は、次のことを示しています。移動コンストラクターが使用可能で、移動操作が noExcept である場合は、const オブジェクトを移動することができます。この場合、u の初期化中に作成された一時オブジェクトが r に移動され、その結果、移動コンストラクターが呼び出されます。
以上がMove コンストラクターが使用できないときに、暗黙的な Move ルールが Move コンストラクターよりもコピー コンストラクターを優先するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。