Maison >développement back-end >C++ >Pourquoi ne puis-je pas utiliser `==` et `!=` avec un opérateur `<=>` personnalisé dans C 20 ?

Pourquoi ne puis-je pas utiliser `==` et `!=` avec un opérateur `<=>` personnalisé dans C 20 ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-07 21:11:031106parcourir

Why Can't I Use `==` and `!=` with a Custom `<=>`Opérateur en C20 ? 
` Opérateur en C 20 ? " />

Opérateur non par défaut <=> et l'absence de == et !=

Dans C 20, l'opérateur du vaisseau spatial <=> ; fournit un mécanisme de comparaison à usage général. Cependant, un comportement étrange se produit lors de l'utilisation d'une implémentation de comparaison à trois voies personnalisée.

L'implémentation par défaut génère == et !=

Considérez le code suivant en utilisant l'implémentation par défaut de <=> :

struct X {
    int Dummy = 0;
    auto operator<=>(const X&amp;) const = default; // Default implementation
};

Dans ce cas, le code se compile avec succès et permet l'utilisation de == et != pour comparer les instances de X :

X a, b;

a == b; // OK!

Blocs d'implémentation personnalisés == et !=

Cependant, lorsqu'une implémentation personnalisée de <=> 🎜>La compilation donne l'erreur :

struct X {
    int Dummy = 0;
    auto operator<=>(const X&amp; other) const {
        return Dummy <=> other.Dummy;
    }
};

Raison du comportement
error C2676: binary '==': 'X' does not define this operator or a conversion to a type acceptable to the predefined operator

Ce comportement est intentionnel selon la norme C 20 :

. Si la définition de classe ne déclare pas explicitement une fonction d'opérateur ==, mais déclare une fonction de

comparaison à trois voies par défaut

, une fonction d'opérateur == est déclarée implicitement avec le même accès que la fonction d'opérateur de comparaison à trois voies .
Seul un <=> L'opérateur génère un == synthétisé. En effet, les classes comme std::vector ne doivent pas utiliser un <=> pour les tests d'égalité, car cela peut être moins efficace qu'une implémentation personnalisée.
Par conséquent, si une classe a un <=> implémentation, le programmeur doit également fournir une implémentation == personnalisée pour garantir un comportement de comparaison correct.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn