ホームページ  >  記事  >  バックエンド開発  >  C 11 の右辺値参照パラメータで自己移動代入は可能ですか?

C 11 の右辺値参照パラメータで自己移動代入は可能ですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-10 13:52:02629ブラウズ

Is Self Move Assignment Possible with Rvalue Reference Parameters in C  11?

自己移動割り当てと標準ライブラリ

C 11 では、標準ライブラリは自己移動割り当てに関する一定の保証を提供します。標準によれば、関数の引数が右辺値参照パラメータにバインドされている場合、実装はそのパラメータがその引数への一意の参照であると想定できます。

次の関数を考えてみましょう:

template<class T>
std::vector<T> selfAssign(std::vector<T> v) {
  v = std::move(v);
  return v;
}

vector 引数は右辺値参照パラメータにバインドされるため、std::vector::operator=(vector&& other) の実装は次のように仮定できます。もう一方は PRVALUE です。その結果、selfAssign 関数の v に対して自己移動代入は不可能です。

標準では、rvalue 参照パラメーターは prvalue であると想定できることが規定されているため、関数での自己移動代入の可能性が排除されています。そのような場合。 selfAssign 関数に渡されたベクトルは、リソースのない状態のままになるか、すでに容量が 0 の場合は何も操作されない可能性があります。

ただし、標準の最新の作業草案である N4618 では、 、これらの要件をわずかに変更します。具体的には、t と rv が同じオブジェクトを参照していない場合、「t = rv」の代入後、t には代入前の rv と同等の値が含まれていればよいだけであると述べています。いずれにせよ、rv の状態は割り当て後も未指定のままです。

以上がC 11 の右辺値参照パラメータで自己移動代入は可能ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。