Maison > développement back-end > C++ > Pourquoi un opérateur de vaisseau spatial personnalisé dans C 20 empêche-t-il la comparaison automatique de l'égalité ?

Pourquoi un opérateur de vaisseau spatial personnalisé dans C 20 empêche-t-il la comparaison automatique de l'égalité ?

Linda Hamilton
Libérer: 2024-11-07 15:05:03
original
197 Les gens l'ont consulté

Why Does a Custom Spaceship Operator in C  20 Prevent Automatic Equality Comparison?

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
};
Copier après la connexion

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;
    }
};
Copier après la connexion

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
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal