C 20 で新しい宇宙船オペレーター (<=>) を使用する場合、カスタム演算子を実装する場合とデフォルトの実装に依存する場合の影響に注意することが重要です。
最初の例では、デフォルトの演算子を使用しています<=>言語によって提供される実装。このデフォルトの実装により、コンパイラーは == 演算子を自動的に生成できます。ただし、カスタム演算子<=>を実装すると、
この動作は、C 標準 ([class.compare.default](https://en.cppreference.com) で述べられているように、意図的なものです。 /w/cpp/ language/comparison#Class_comparison)):
If the class definition does not explicitly declare an == operator function, but declares a defaulted three-way comparison operator function, an == operator function is declared implicitly with the same access as the three-way comparison operator function.
この設計選択の背後にある理由は、== を決定するための最も効率的な方法ではない可能性がある状況で == が暗黙的に生成されるのを防ぐことです。平等。たとえば、 std::vector のようなクラスでは、デフォルト以外の <=> を使用すべきではありません。最初にサイズを比較する方が効率的であるため、等価性テストの場合に使用します。
カスタム <=>実装では、クラスは == のカスタム実装も必要とする特殊な操作を実行している可能性があります。したがって、言語は最適ではない可能性のあるデフォルト実装を生成する代わりに、プログラマに == 演算子を明示的に定義するよう任せます。
以上がデフォルトではない宇宙船オペレーターが C 20 で `==` と `!=` を生成しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。