自己移動割り当てと標準ライブラリ
C 11 では、標準ライブラリは自己移動割り当てに関する一定の保証を提供します。標準によれば、関数の引数が右辺値参照パラメータにバインドされている場合、実装はそのパラメータがその引数への一意の参照であると想定できます。
次の関数を考えてみましょう:
template<class T> std::vector<T> selfAssign(std::vector<T> v) { v = std::move(v); return v; }
vector 引数は右辺値参照パラメータにバインドされるため、std::vector
標準では、rvalue 参照パラメーターは prvalue であると想定できることが規定されているため、関数での自己移動代入の可能性が排除されています。そのような場合。 selfAssign 関数に渡されたベクトルは、リソースのない状態のままになるか、すでに容量が 0 の場合は何も操作されない可能性があります。
ただし、標準の最新の作業草案である N4618 では、 、これらの要件をわずかに変更します。具体的には、t と rv が同じオブジェクトを参照していない場合、「t = rv」の代入後、t には代入前の rv と同等の値が含まれていればよいだけであると述べています。いずれにせよ、rv の状態は割り当て後も未指定のままです。
以上がC 11 の右辺値参照パラメータで自己移動代入は可能ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。