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'utilisation d'un opérateur de vaisseau spatial personnalisé empêche-t-elle la génération d'opérateurs d'égalité en C ?

DDD
DDDoriginal
2024-11-09 17:56:02784parcourir

Does Using a Custom Spaceship Operator Prevent the Generation of Equality Operators in 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&amp;) 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!

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