デフォルトではない <=>演算子と == および !=
の不在 C 20 では、新しく導入された宇宙船演算子 (<=>) により、== および != 演算子の生成に関して予期しない動作が発生しました。 。カスタム実装でデフォルト以外の宇宙船オペレーターを使用すると、コンパイル エラーが発生する可能性があります。
デフォルトでは、宇宙船オペレーターは指定されたタイプの 2 つのオブジェクトを比較します。クラスが == 演算子を明示的に定義していないが、デフォルトのデフォルトではない宇宙船演算子を定義している場合、コンパイラは宇宙船演算子と同じアクセス権を持つ == 演算子を自動的に生成します。言語標準 [class.compare.default] で指定されているこの動作により、std::vector のようなクラスが等価性テストにデフォルト以外の宇宙船演算子を使用しないことが保証されます。
ただし、宇宙船演算子がそうでない場合は、デフォルトの場合 (つまり、カスタム実装がある場合)、コンパイラーは == 演算子を生成しません。これは、カスタム宇宙船演算子を定義するクラスでは、特定の比較シナリオを処理するために == の特殊な実装が必要になる場合があるためです。したがって、この言語では、必要に応じて == 演算子を明示的に定義するかどうかはプログラマに任されています。
たとえば、次のコードを考えてみましょう。
このコードは、宇宙船が存在するため、正常にコンパイルされます。演算子はデフォルトであり、コンパイラは == 演算子を生成します。ただし、宇宙船演算子をカスタム実装に変更すると、
コードはコンパイルに失敗し、== 演算子がクラス X に定義されていないことを示すエラーが表示されます。修正された宇宙船演算子はデフォルトではなく、コンパイラは == 演算子を自動的に生成しません。この場合、ユーザーはカスタム クラスの比較ニーズに対応するために == 演算子を明示的に定義する必要があります。
以上がカスタム `spaceship` 演算子が C 20 で `==` および `!=` 演算子を生成しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。