` C 20 の演算子? " />
デフォルト以外の演算子 <=> と == と !=
C 20 では、宇宙船演算子 <=> ; は汎用の比較メカニズムを提供します。ただし、カスタムの 3 方向比較実装を使用すると、奇妙な動作が発生します。
デフォルトの実装では == と !=
<=> のデフォルト実装を使用した次のコードを考えてみましょう:
struct X { int Dummy = 0; auto operator<=>(const X&) const = default; // Default implementation };
この場合、コードは正常にコンパイルされ、X のインスタンスを比較するために == と != の使用が許可されます。
X a, b; a == b; // OK!
カスタム実装ブロック == および !=
ただし、<=> のカスタム実装が提供される場合:
struct X { int Dummy = 0; auto operator<=>(const X& other) const { return Dummy <=> other.Dummy; } };
コンパイルすると次のエラーが発生します:
error C2676: binary '==': 'X' does not define this operator or a conversion to a type acceptable to the predefined operator
動作の理由
C 20 標準によれば、この動作は意図的です:
。クラス定義で == 演算子関数が明示的に宣言されていないが、デフォルトの 3 方向比較 関数が宣言されている場合、== 演算子関数は 3 方向比較演算子関数と同じアクセス権で暗黙的に宣言されます。 .
デフォルトの <=> のみ演算子は合成された == を生成します。これは、std::vector のようなクラスがデフォルト以外の <=> を使用すべきではないためです。カスタム実装よりも効率が劣る可能性があるため、等価性テストの場合に使用します。
したがって、クラスにカスタム <=> がある場合、実装に加えて、プログラマは正しい比較動作を保証するためにカスタム == 実装も提供する必要があります。
以上がC 20 でカスタム `<=>` 演算子とともに `==` および `!=` を使用できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。