宇宙船演算子と同等性の比較
C 20 宇宙船演算子 (<=> としても知られる) には、便利で簡潔な構文が導入されています値を比較するため。ただし、特定のシナリオでは、予期される等価演算子および不等号演算子 (== および !=) が生成されない場合があります。この質問では、この動作と、カスタム宇宙船オペレーター実装がこれらの追加オペレーターの作成を妨げる理由について説明します。
問題の説明
宇宙船オペレーターがデフォルト実装の構造体で使用されています:
struct X { int Dummy = 0; auto operator<=>(const X& other) const = default; // Default implementation };
このコードはエラーなしでコンパイルされます。ただし、カスタムの宇宙船演算子実装を定義する場合:
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
説明
この動作は、言語標準で定義されているように、意図的なものです。クラスにデフォルトの宇宙船演算子がある場合、コンパイラーは等価演算子のデフォルト実装を合成します。ただし、宇宙船演算子がカスタム定義で実装されている場合、コンパイラは等価演算子を自動的に生成しません。
この区別は、効率性への懸念から生じています。宇宙船演算子は、値の完全な順序付けを提供するように設計されていますが、等価演算子 (==) は、完全な比較を試みる前にサイズを比較するなどの最適化を実行できます。 std::vector のようなクラスの場合、等価比較に spaceship 演算子を使用することは、最も効率的なアプローチではない可能性があります。
等価演算子の実装をプログラマに任せることで、コンパイラは非一致を生成する可能性を回避します。 -最適な実装。したがって、クラスにデフォルトではない宇宙船演算子がある場合、開発者は等価演算子も明示的に定義する必要があります。
以上がC 20 のカスタム宇宙船オペレーターが自動等価比較を妨げるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。