値と暗黙的な移動ルールによる名前付きオブジェクトの返し
C では、オブジェクトは参照または次のいずれかによって関数から返されます。価値。値によって返される場合、オブジェクトはコンテキストに応じてコピーまたは移動されます。暗黙的な移動ルールは、オブジェクトが一時的な関数から値によってオブジェクトを返すときに適用されます。
例 1: コンストラクターの移動
次の例を考えてみましょう。
<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(test&& s)noexcept{ printf("test(test&& s)\n"); } test& operator=(test e) { printf("test& operator=(test e)\n"); return *this; } }; test Some_thing() { test i; return i; } int main() { Some_thing(); return 0; }</code>
この例は、次の値で test 型のオブジェクトを返します。コンストラクター:
関数 Some_thing が呼び出されると、デフォルトで関数内に test のインスタンスが作成されて返されます。暗黙的な移動ルールが適用され、移動コンストラクター test(test&&) を使用して一時オブジェクトを関数によって返されたオブジェクトに移動します。
したがって、出力は次の手順を示します。
例 2: コンストラクターのコピー
次に、この変更された例を考えてみましょう。
<code class="cpp">class test { public: test(int y) { printf("test(int y)\n"); } test() { printf("test()\n"); } test(test& z) { printf("test(test&z)\n"); } test& operator=(test e) { printf("test& operator=(test e)\n"); return *this; } }; test Some_thing() { test i; return i; } int main() { Some_thing(); return 0; }</code>
この場合、移動コンストラクタのテスト(test&&)は使用できません。代わりに、コピー コンストラクター test(test&) を使用して、関数によって返された一時オブジェクトを main のスタック上に作成されたオブジェクトにコピーします。
出力には次の手順が示されています。
例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(test&z)\n"); } test& operator=(test e) { printf("test& operator=(test e)\n"); return *this; } }; test Some_thing() { test i; return i; } int main() { Some_thing(); return 0; }</code>
移動コンストラクターは使用できなくなり、コンパイルは失敗します。戻り値に使用できる実行可能なコンストラクターがありません。
結論として、クラスのオブジェクトを返すときに暗黙的な移動ルールが適用されます。オブジェクトが一時的な関数からの値によって。移動コンストラクターが使用可能な場合はそれが使用されますが、使用できない場合は代わりにコピー コンストラクターが使用されます。移動コンストラクターが明示的に削除された場合、コンパイルは失敗します。
以上がC で名前付きオブジェクトを値で返す場合、暗黙的な移動ルールは適用されますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。