宇宙船オペレーターとその等価演算子への影響
C 20 で導入された宇宙船オペレーター <=> は、簡潔な三者比較の構文。ただし、spaceship 演算子と等価演算子 (== と !=) の両方を使用すると予期しない動作が発生し、ユーザーは驚くかもしれません。
デフォルトの実装と生成された等価演算子
宇宙船オペレーターがデフォルトとして宣言されている場合 (例: autooperator<=>(const X&)) const =default;) を指定すると、コンパイラが基礎となる比較に基づいて == 演算子を自動的に生成できるようになります。これは次の例で示されています。
struct X { int Dummy = 0; auto operator<=>(const X&) const = default; }; int main() { X a, b; a == b; // OK! }
カスタム実装と非生成等価演算子
ただし、宇宙船演算子のカスタム実装が提供される場合、生成された等価演算子は使用できなくなりました。これは質問の内容で確認されており、カスタム演算子<=>が使用されています。 == 演算子を使用すると、実装でエラーが発生しました。
動作の背後にある理由
この動作は意図的です。 C 標準では、デフォルトの宇宙船演算子のみが等価演算子の生成をトリガーすることを指定しています ([class.compare.default](https://eel.is/cdraft/class.compare.default))。その根拠は、std::vector などの特定のクラスが、最も効率的なアプローチではない可能性があるため、等価性チェックに spaceship 演算子を使用したくない可能性があるということです。
結論
したがって、カスタム宇宙船演算子を定義するときは、等価演算子の自動生成を排除することに留意することが重要です。等価性チェックが必要な場合は、== 演算子を明示的に定義することをお勧めします。
以上がカスタム Spaceship 演算子を使用すると、C での等価演算子の生成が妨げられますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。