C 20 でカスタム `<=>` 演算子とともに `==` および `!=` を使用できないのはなぜですか?

Linda Hamilton
リリース: 2024-11-07 21:11:03
オリジナル
986 人が閲覧しました

Why Can't I Use `==` and `!=` with a Custom `<=>` C 20 の演算子? 
` C 20 の演算子? " />

デフォルト以外の演算子 <=> と == と !=

C 20 では、宇宙船演算子 <=> ; は汎用の比較メカニズムを提供します。ただし、カスタムの 3 方向比較実装を使用すると、奇妙な動作が発生します。

デフォルトの実装では == と !=

<=> のデフォルト実装を使用した次のコードを考えてみましょう:

struct X {
    int Dummy = 0;
    auto operator<=>(const X&amp;) const = default; // Default implementation
};
ログイン後にコピー

この場合、コードは正常にコンパイルされ、X のインスタンスを比較するために == と != の使用が許可されます。

X a, b;

a == b; // OK!
ログイン後にコピー

カスタム実装ブロック == および !=

ただし、<=> のカスタム実装が提供される場合:

struct X {
    int Dummy = 0;
    auto operator<=>(const X&amp; 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
ログイン後にコピー

動作の理由

C 20 標準によれば、この動作は意図的です:

。クラス定義で == 演算子関数が明示的に宣言されていないが、デフォルトの 3 方向比較 関数が宣言されている場合、== 演算子関数は 3 方向比較演算子関数と同じアクセス権で暗黙的に宣言されます。 .

デフォルトの <=> のみ演算子は合成された == を生成します。これは、std::vector のようなクラスがデフォルト以外の <=> を使用すべきではないためです。カスタム実装よりも効率が劣る可能性があるため、等価性テストの場合に使用します。

したがって、クラスにカスタム <=> がある場合、実装に加えて、プログラマは正しい比較動作を保証するためにカスタム == 実装も提供する必要があります。

以上がC 20 でカスタム `<=>` 演算子とともに `==` および `!=` を使用できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!