` 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&) 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& 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
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 decomparaison à 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!