Maison > développement back-end > C++ > le corps du texte

Pourquoi ne puis-je pas utiliser `==` et `!=` avec un opérateur `<=>` personnalisé dans C 20 ?

Linda Hamilton
Libérer: 2024-11-07 21:11:03
original
986 Les gens l'ont consulté

Why Can't I Use `==` and `!=` with a Custom `<=>`Opérateur en C20 ? 
` 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&amp;) const = default; // Default implementation
};
Copier après la connexion

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

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&amp; other) const {
        return Dummy <=> other.Dummy;
    }
};
Copier après la connexion

Raison du comportement
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

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 de

comparaison à 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!

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
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!