移動代入演算子と 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 つあります:
現在および将来の標準:
The C 11標準では、移動代入演算子の特定の解釈を明示的に義務付けていません。ただし、プログラマは移動代入演算子の実装を通じて動作を定義できます。
提案されている C 20 作業草案には、自己移動代入がクラッシュすべきではないことを示唆する移動代入に関するセクションが含まれていますが、現在の値を保持するか、オブジェクトを有効ではあるが未指定のままにするかは指定されていません。 state.
結論:
移動代入演算子における if (this != &rhs) チェックの必要性は、解釈と特定の実装要件の問題です。自己移動割り当てが現在の値を保持することが期待される場合、チェックが必要です。それ以外の場合は、最適化として省略できます。
以上がC の移動代入演算子に「if (this != &rhs)」チェックが必要ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。