Maison >développement back-end >C++ >L'utilisation d'un opérateur de vaisseau spatial personnalisé empêche-t-elle la génération d'opérateurs d'égalité en C ?
L'opérateur de vaisseau spatial et son impact sur l'égalité des opérateurs
L'opérateur de vaisseau spatial <=>, introduit dans le C 20, fournit un aperçu concis syntaxe pour les comparaisons à trois voies. Cependant, les utilisateurs rencontrant un comportement inattendu lorsqu'ils utilisent à la fois l'opérateur de vaisseau spatial et les opérateurs d'égalité (== et !=) peuvent être surpris.
Implémentation par défaut et opérateurs d'égalité générés
Lorsque l'opérateur du vaisseau spatial est déclaré par défaut (par exemple, auto Operator<=>(const X&) const = default;), cela permet au compilateur de générer automatiquement un opérateur == basé sur la comparaison sous-jacente. Ceci est démontré dans l'exemple suivant :
struct X { int Dummy = 0; auto operator<=>(const X&) const = default; }; int main() { X a, b; a == b; // OK! }
Implémentation personnalisée et opérateurs d'égalité non générés
Cependant, lorsqu'une implémentation personnalisée de l'opérateur de vaisseau spatial est fournie, les opérateurs d'égalité générés ne sont plus disponibles. Cela a été observé dans le contenu de la question, où un opérateur personnalisé<=> l'implémentation a entraîné une erreur lors de l'utilisation de l'opérateur ==.
Raisonnement derrière le comportement
Ce comportement est intentionnel. Le standard C précise que seul un opérateur de vaisseau spatial par défaut déclenche la génération d'un opérateur d'égalité ([class.compare.default](https://eel.is/c draft/class.compare.default)). La raison est que certaines classes, telles que std::vector, peuvent ne pas vouloir utiliser l'opérateur de vaisseau spatial pour les contrôles d'égalité, car ce n'est peut-être pas l'approche la plus efficace.
Conclusion
Ainsi, lors de la définition d'un opérateur de vaisseau spatial personnalisé, il est important de garder à l'esprit qu'il élimine la génération automatique d'opérateurs d'égalité. Si des contrôles d'égalité sont requis, il est recommandé de fournir une définition explicite de l'opérateur ==.
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!