ホームページ  >  記事  >  バックエンド開発  >  Move コンストラクターが使用できないときに、暗黙的な Move ルールが Move コンストラクターよりもコピー コンストラクターを優先するのはなぜですか?

Move コンストラクターが使用できないときに、暗黙的な Move ルールが Move コンストラクターよりもコピー コンストラクターを優先するのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-05 10:36:02908ブラウズ

Why Does the Implicit Move Rule Prefer a Copy Constructor Over a Move Constructor When the Move Constructor is Unavailable?

暗黙的な移動ルールを使用して値によってクラス オブジェクトを返す

関数から値によってクラスのオブジェクトを返す場合、暗黙的な移動ルールが適用されます。このルールは、返されたオブジェクトを初期化するためにどのコンストラクターを使用するかを決定します。通常、オブジェクトが 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。