値によって関数からクラスのオブジェクトを返す
関数からクラスのオブジェクトを値によって返す場合を考えてみましょう。価値。このシナリオでは、返されるオブジェクトは通常、左辺値とみなされます。これは、オブジェクトがメモリ内に名前とアドレスを持っていることを意味します。ただし、特定の状況では、返されたオブジェクトが右辺値、つまり名前やアドレスのない一時オブジェクトとして扱われる可能性があります。
暗黙的な移動ルール
C では、オブジェクトを値で返すときに適用される暗黙的な移動ルール。このルールは、次の条件が満たされる場合に指定します。
このような場合、コピー コンストラクターの代わりに移動コンストラクターが呼び出されます。この動作は、不必要なコピーを回避してパフォーマンスを最適化することを目的としています。
例 1
この例では、返されるオブジェクト i は左辺値であるため、コピー コンストラクター test( const test& z) が呼び出されます:
<code class="cpp">class test { public: test(int y) { printf("test(int y)\n"); } test() { printf("test()\n"); } test(const test& z) { printf("test(const test&z)\n"); } }; test Some_thing() { test i; return i; }</code>
出力:
test() test(const test&z)
例 2
ただし、次の例では、返されたオブジェクト i は xvalue として扱われ、オブジェクトは一時的であり、移動コンストラクターが実行可能であるため、移動コンストラクター test(test&& s) が呼び出されます:
<code class="cpp">class test { public: test(int y) { printf("test(int y)\n"); } test() { printf("test()\n"); } test(test&& s) { printf("test(test&& s)\n"); } }; test Some_thing() { test i; return i; }</code>
出力:
test() test(test&& s)
例 3
移動コンストラクターが提供されていないか明示的に削除されている場合、暗黙的な移動ルールを適用できず、プログラムはコンパイルに失敗します。
<code class="cpp">class test { public: test(test&& z) = delete; test(int y) { printf("test(int y)\n"); } test() { printf("test()\n"); } test(const test& z) { printf("test(const test&z)\n"); } }; test Some_thing() { test i; return i; }</code>
結論
オブジェクトを値で返す場合、特定の条件下で暗黙的な移動ルールが適用され、移動コンストラクターが呼び出される場合があります。この動作を理解することは、コードを最適化し、コンパイル エラーを防ぐために非常に重要です。
以上がオブジェクトを値で返すと移動コンストラクターがトリガーされるのはどのような場合ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。