ホームページ >バックエンド開発 >C++ >C の移動代入演算子に「if (this != &rhs)」チェックが必要ですか?

C の移動代入演算子に「if (this != &rhs)」チェックが必要ですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-05 22:16:11606ブラウズ

Do We Need the `if (this != &rhs)` Check in C   Move Assignment Operators?

移動代入演算子と if (this != &rhs)

クラスのコピー代入演算子では、これが一般的です割り当てられているオブジェクトが、防止する呼び出しオブジェクトであるかどうかを確認します。 self-assignment:

Class& Class::operator=(const Class& rhs) {
    if (this != &rhs) {
        // Do the assignment
    }

    return *this;
}

このチェックは、オブジェクトがそれ自体に割り当てられるのを防ぐために重要です。これにより、予期しない動作やエラーが発生する可能性があります。ただし、移動代入演算子の場合、このチェックの必要性については議論の余地があります。

移動代入演算子にも同じチェックが必要ですか?

Class& Class::operator=(Class&& rhs) {
    if (this != &rhs) {
        // Do the assignment
    }

    return *this;
}

この == &rhs が移動代入演算子に対して true になる状況があり得るかどうかという疑問が生じます。答えは、移動代入演算子の解釈によって異なります。

移動代入演算子の解釈:

移動代入演算子の主な解釈は 2 つあります:

  1. 現在の値を保持します: 自己移動代入を主張する人もいます(this == &rhs の場合) はオブジェクトの現在の値を保持する必要があります。この場合、誤った自己代入を防ぐために if (this != &rhs) チェックが必要です。
  2. 有効な状態に設定します: 他の人は、自己移動代入演算子は次のように主張しています。必ずしも現在の値を保持する必要はありませんが、オブジェクトを有効な状態のままにしておく必要があります。この場合、if (this != &rhs) チェックは厳密には必要ありません。ただし、自己代入での移動操作の実行を回避するための最適化としては依然として役立ちます。

現在および将来の標準:

The C 11標準では、移動代入演算子の特定の解釈を明示的に義務付けていません。ただし、プログラマは移動代入演算子の実装を通じて動作を定義できます。

提案されている C 20 作業草案には、自己移動代入がクラッシュすべきではないことを示唆する移動代入に関するセクションが含まれていますが、現在の値を保持するか、オブジェクトを有効ではあるが未指定のままにするかは指定されていません。 state.

結論:

移動代入演算子における if (this != &rhs) チェックの必要性は、解釈と特定の実装要件の問題です。自己移動割り当てが現在の値を保持することが期待される場合、チェックが必要です。それ以外の場合は、最適化として省略できます。

以上がC の移動代入演算子に「if (this != &rhs)」チェックが必要ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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