Opérateur de comparaison à trois voies en C++20
Utiliser l’opérateur vaisseau spatial pour des comparaisons concises et cohérentes
Opérateur de comparaison à trois voies en C++20 est une leçon C++ Academy gratuite sur CoddyKit. Ceci est la leçon 4 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage C++ Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours C++ Academy comprend 4 leçons au total.
L'opérateur spaceship <=>
C++20 a introduit l'opérateur de comparaison à trois voies <=>. Un seul opérateur fournit au compilateur tout ce dont il a besoin pour générer les six opérateurs relationnels.
Types de retour : trois catégories
Le type de retour dépend de la force de l'ordre :
std::strong_ordering— valeurs équivalentes distinguablesstd::weak_ordering— valeurs équivalentes mais distinguables (par exemple, sans distinction entre majuscules et minuscules)std::partial_ordering— certaines valeurs sont incomparables (par exemple, NaN)
Comparaison par défaut
Le schéma le plus courant consiste à demander au compilateur de générer <=> en comparant les membres selon l'ordre lexicographique.
struct Point {
int x;
int y;
auto operator<=>(const Point& other) const = default;
};
Point a{1, 2}, b{1, 3};
bool less = (a < b); // true — auto-generatedLes six gratuitement
La définition par défaut de <=> définit également == par défaut. Ensemble, ils génèrent !=, <, <=, >, >= — les six opérateurs en une seule ligne.
Implémentation personnalisée de <=>
Écrivez manuellement le corps pour une logique de comparaison personnalisée.
std::strong_ordering operator<=>(const Person& other) const {
if (auto c = name <=> other.name; c != 0) return c;
return age <=> other.age;
}Utiliser le résultat
Le résultat de <=> peut être comparé à la valeur littérale 0 pour effectuer le test booléen souhaité.
if ((a <=> b) < 0) std::cout << "a less\n";
if ((a <=> b) == 0) std::cout << "equal\n";
if ((a <=> b) > 0) std::cout << "a greater\n";Nombres flottants et partial_ordering
Pour les nombres flottants, utilisez std::partial_ordering afin de gérer NaN : une comparaison avec NaN produit unordered.
struct Measurement {
double value;
std::partial_ordering operator<=>(const Measurement&) const = default;
};Exemple d'ordre faible
Utilisez un ordre faible lorsque des valeurs peuvent être distinguables tout en étant considérées comme égales, par exemple pour des chaînes insensibles à la casse.
Définir == séparément
Vous pouvez définir <=> par défaut et écrire un == personnalisé : les règles d'égalité peuvent parfois différer de celles de l'ordre.
Migrer un ancien code
Si votre classe possédait auparavant de nombreux opérateurs de comparaison, remplacez-les par un <=> défini par défaut lors de la migration vers C++20. Beaucoup moins de code, les mêmes sémantiques.
Quand ne pas utiliser <=>
Pour les types où seule l'égalité compte (sans notion d'ordre), fournissez uniquement operator== et operator!= (ce dernier est généré automatiquement en C++20).
Remarque sur les performances
Le compilateur peut optimiser <=> défini par défaut aussi efficacement que des comparaisons écrites manuellement. L'utilisation de l'opérateur spaceship n'ajoute aucun surcoût à l'exécution.
Vérification rapide
Quelle catégorie de retour faut-il utiliser pour les types à virgule flottante susceptibles de contenir NaN ?
Récapitulatif
L'opérateur <=> de C++20 génère les six opérateurs relationnels à partir d'une seule définition. Définissez-le par défaut pour comparer les membres selon l'ordre lexicographique. Choisissez un ordre fort, faible ou partiel en fonction de la sémantique de votre type.
Apprends C++ avec un tuteur IA — gratuit
Écris et exécute du vrai code dans ton navigateur, obtiens de l'aide instantanée d'un tuteur IA disponible 24h/24, et reprends là où tu t'es arrêté sur le web ou dans l'app.
- Cours
- 51
- Leçons
- 203
Questions Fréquemment Posées
La leçon « Opérateur de comparaison à trois voies en C++20 » est-elle gratuite ?
Oui — le texte complet de « Opérateur de comparaison à trois voies en C++20 » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours C++ Academy, passe à CoddyKit PRO. Le cours C++ Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Opérateur de comparaison à trois voies en C++20 » ?
Utiliser l’opérateur vaisseau spatial pour des comparaisons concises et cohérentes Tu pratiques C++ Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer C++ Academy ?
Aucune expérience préalable n'est requise. C++ Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 4 sur 4.
Combien de temps prend la leçon « Opérateur de comparaison à trois voies en C++20 » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon C++ Academy ?
Oui. Chaque leçon C++ Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Opérateurs arithmétiques et de comparaison
- Opérateurs d’insertion et d’extraction de flux
- Opérateurs d’indice et d’appel de fonction
- Opérateur de comparaison à trois voies en C++20