C++ Academy · Leçon

Opérateur de comparaison à trois voies en C++20

Utiliser l’opérateur vaisseau spatial pour des comparaisons concises et cohérentes

Leçon 4 sur 414 étapes

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 distinguables
  • std::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-generated

Les 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 &lt;=&gt;

É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 &lt;=&gt;

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.

Gratuit pour commencer

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

  1. Opérateurs arithmétiques et de comparaison
  2. Opérateurs d’insertion et d’extraction de flux
  3. Opérateurs d’indice et d’appel de fonction
  4. Opérateur de comparaison à trois voies en C++20
← Retour à C++ Academy