L'opérateur du vaisseau spatial et comparaison de l'égalité
L'opérateur du vaisseau spatial C 20 (également connu sous le nom de <=>) introduit une syntaxe pratique et concise pour comparer les valeurs. Cependant, dans certains scénarios, il peut ne pas générer les opérateurs d'égalité et d'inégalité attendus (== et !=). Cette question explore ce comportement et pourquoi l'implémentation d'un opérateur de vaisseau spatial personnalisé peut empêcher la création de ces opérateurs supplémentaires.
Description du problème
Considérez l'extrait de code suivant où l'opérateur du vaisseau spatial est utilisé dans une structure avec une implémentation par défaut :
struct X { int Dummy = 0; auto operator<=>(const X& other) const = default; // Default implementation };
Ce code se compile sans erreurs. Cependant, si nous définissons une implémentation d'opérateur de vaisseau spatial personnalisée :
struct X { int Dummy = 0; auto operator<=>(const X& other) const { return Dummy <=> other.Dummy; } };
Le compilateur émettra une erreur lors de la tentative d'utilisation de l'opérateur d'égalité (==) :
error C2676: binary '==': 'X' does not define this operator or a conversion to a type acceptable to the predefined operator
Explication
Ce comportement est intentionnel, tel que défini par la norme linguistique. Lorsqu'une classe a un opérateur de vaisseau spatial par défaut, le compilateur synthétise une implémentation par défaut de l'opérateur d'égalité. Cependant, si l'opérateur de vaisseau spatial est implémenté avec une définition personnalisée, le compilateur ne génère pas automatiquement l'opérateur d'égalité.
Cette distinction découle de soucis d'efficacité. L'opérateur du vaisseau spatial est conçu pour fournir un classement complet des valeurs, tandis que l'opérateur d'égalité (==) peut effectuer des optimisations, telles que comparer les tailles avant de tenter une comparaison complète. Pour des classes comme std::vector, utiliser l'opérateur de vaisseau spatial pour les comparaisons d'égalité n'est peut-être pas l'approche la plus efficace.
En laissant au programmeur le soin d'implémenter l'opérateur d'égalité, le compilateur évite le risque de générer un non -mise en œuvre optimale. Ainsi, si une classe a un opérateur de vaisseau spatial autre que celui par défaut, le développeur doit également définir explicitement l'opérateur d'égalité.
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!