ホームページ >バックエンド開発 >C++ >カスタム Spaceship 演算子を使用すると、C での等価演算子の生成が妨げられますか?

カスタム Spaceship 演算子を使用すると、C での等価演算子の生成が妨げられますか?

DDD
DDDオリジナル
2024-11-09 17:56:02787ブラウズ

Does Using a Custom Spaceship Operator Prevent the Generation of Equality Operators in C  ?

宇宙船オペレーターとその等価演算子への影響

C 20 で導入された宇宙船オペレーター <=> は、簡潔な三者比較の構文。ただし、spaceship 演算子と等価演算子 (== と !=) の両方を使用すると予期しない動作が発生し、ユーザーは驚くかもしれません。

デフォルトの実装と生成された等価演算子

宇宙船オペレーターがデフォルトとして宣言されている場合 (例: autooperator<=>(const X&)) const =default;) を指定すると、コンパイラが基礎となる比較に基づいて == 演算子を自動的に生成できるようになります。これは次の例で示されています。

struct X {
    int Dummy = 0;
    auto operator<=>(const X&amp;) 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。