C 11 標準ライブラリの自己移動割り当て
C 11 標準には、特に標準と関連して自己移動割り当てに関するさまざまな規定が含まれています。図書館。この記事では、ライブラリ関数における自己移動代入の影響に焦点を当てて、これらの規定について説明します。
特に、標準は、標準ライブラリ関数の引数が右辺値参照パラメータである場合、実装がその排他性を想定できることを保証します。 。これは、渡されたオブジェクトが関数によって変更されないという理解に基づいて、実装がコードを最適化できることを意味します。
自己移動代入のコンテキストでは、この保証は注目に値する影響を与えます。たとえば、次の関数について考えてみましょう。
template<class T> std::vector<T> selfAssign(std::vector<T> v) { v = std::move(v); return v; }
左辺値が渡されると、ベクトルのコピー コンストラクターが呼び出され、入力ベクトルのコピーが作成されます。ただし、標準ライブラリの保証により、ベクトルの移動代入演算子の実装では、その引数が prvalue であると想定できます。したがって、自己移動代入は実現不可能であり、関数の動作は実装に依存します。
ほとんどの場合、自己移動代入では元のベクトルがリソースなしの状態 (容量 0) のままになります。 。ベクトルの容量がすでに 0 である場合、操作は何も行われません。ただし、自己移動割り当て後は元のベクトルと移動されたベクトルの両方の状態が未指定であることに注意することが重要です。
作業草案 N4618 の標準に対する最近の更新では、これらの規定がさらに明確になり、MoveAssignable でそのことが指定されています。要件では、右辺値 (rv) が式 (t) に割り当てられている場合、t と rv が同じオブジェクトを参照していない場合、t は代入前に rv の値を取得するだけで済みます。この条件に関係なく、割り当て後の rv の状態は未指定のままです。
さらに、t と rv が同じオブジェクトを参照しているかどうかに関係なく、rv はそれを利用するライブラリ コンポーネントの要件に従う必要があることを注記しています。
以上がC 11 標準ライブラリ関数の自己移動代入には保証がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。