標準ライブラリ コンテナでの自己移動割り当て
C 11 標準は、自己移動割り当て (オブジェクトがオブジェクトに割り当てられた後のオブジェクト自体への割り当て) を保証します。から移動されました) のような標準ライブラリ コンテナでは不可能ですstd::vector.
標準の特定の規定は [res.on.arguments] にあり、右辺値参照にバインドされた関数の引数は、バインドされた引数への一意の参照とみなされると規定されています。これは、引数が代入のターゲットと同じオブジェクトを参照していないと実装が想定できることを意味します。
std::vector の場合、移動代入演算子 (operator=) は次のように定義されます。右辺値参照を取得します。したがって、selfAssign() が std::vector 引数を指定して呼び出された場合、標準では、実装はその引数が一時オブジェクトへの一意の参照であると想定できます。その結果、自己移動割り当ては不可能になり、std::vector はリソースのない状態 (容量 0) のままになります。
ただし、この動作は保証されているのは次の場合のみであることに注意してください。標準ライブラリコンテナ。ユーザー定義型の場合、C 11 標準は自己移動割り当てに関する保証を提供しません。
以上がC 11 の標準ライブラリ コンテナに対して自己移動割り当てが許可されないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。