問題:
一意のポインター (std::unique_ptr) C では、移動セマンティクスを厳密に遵守し、コピー構築を禁止します。ただし、コピー コンストラクターを呼び出さずに、関数から値によって一意のポインターを返し、その戻り値を割り当てることは可能です。このアクションにより、この一見逆説的な動作がどのように許可されるのかについて疑問が生じます。
質問:
この例外を許可する特定の条項が言語仕様にありますか?
答え:
はい。 C 11 の §34 および §35 に記載されているように、コンパイラは特定のシナリオで「コピー省略」を実行することが許可されています。関連する抜粋は次のとおりです:
When certain criteria are met, an implementation is allowed to omit the copy/move construction of a class object [...]. This elision of copy/move operations, called copy elision, is permitted [...] in a return statement in a function with a class return type, when the expression is the name of a non-volatile automatic object with the same cv-unqualified type as the function return type [...].
本質的に、これは、戻り値が戻り値の型に一致する不揮発性の自動オブジェクトである場合、コンパイラーはコピー/移動構造をスキップできることを意味します。
さらに、仕様に従って:
When the criteria for elision of a copy operation are met and the object to be copied is designated by an lvalue, overload resolution to select the constructor for the copy is first performed as if the object were designated by an rvalue.
これは、左辺値 (名前付きオブジェクト) を返すとき、移動すると、コンパイラはコンストラクターの選択を右辺値 (一時オブジェクト) であるかのように解決しようとします。
実装の詳細:
この最適化はコンパイラー技術によって実装されます。 。コピー省略が許可されている場合、コンパイラーは、コピー構築を行わずに、指定されたメモリー位置に返されたオブジェクトを直接作成します。このアプローチにより、返されるオブジェクトが一意であることが保証され、不必要なオブジェクトの作成と破棄が回避されます。
この動作は C 0x に固有であることに注意することが重要であり、以前のバージョンの C では、値によって一意のポインターを返すことは可能でした。通常、未定義の動作またはコンパイラ エラーが発生します。
以上が値によって一意のポインタを返すと、C でのコピー構築がどのように回避されるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。