Operatore di confronto a tre vie in C++20
Usi l'operatore spaceship per confronti concisi e coerenti
Operatore di confronto a tre vie in C++20 è una lezione C++ Academy gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento C++ Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso C++ Academy include 4 lezioni in totale.
L'operatore spaceship <=>
C++20 ha introdotto l'operatore di confronto a tre vie <=>. Un solo operatore fornisce al compilatore tutto ciò che serve per generare i sei operatori relazionali.
Tipi restituiti: tre categorie
Il tipo restituito dipende dalla forza dell'ordinamento:
std::strong_ordering— valori equivalenti indistinguibilistd::weak_ordering— valori equivalenti ma distinguibili, ad esempio senza distinzione tra maiuscole e minuscolestd::partial_ordering— alcuni valori non sono confrontabili, ad esempio NaN
Confronto generato automaticamente
Il pattern più comune consiste nel chiedere al compilatore di generare <=> confrontando i membri in ordine lessicografico.
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-generatedTutti e sei gratuitamente
La generazione automatica di <=> genera automaticamente anche ==. Insieme, generano !=, <, <=, >, >=: tutti e sei in una sola riga.
Implementazione personalizzata di <=>
Scriva manualmente il corpo per implementare una logica di confronto personalizzata.
std::strong_ordering operator<=>(const Person& other) const {
if (auto c = name <=> other.name; c != 0) return c;
return age <=> other.age;
}Utilizzo del risultato
Il risultato di <=> può essere confrontato con il valore letterale 0 per eseguire il controllo booleano desiderato.
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";Virgola mobile e partial_ordering
Per i numeri in virgola mobile, utilizzi std::partial_ordering per gestire NaN: un confronto con NaN restituisce unordered.
struct Measurement {
double value;
std::partial_ordering operator<=>(const Measurement&) const = default;
};Esempio di ordinamento debole
Utilizzi l'ordinamento debole quando i valori possono essere distinguibili ma risultare uguali nel confronto, come nel caso delle stringhe senza distinzione tra maiuscole e minuscole.
Definizione indipendente di ==
È possibile generare automaticamente <=> e scrivere un == personalizzato: talvolta l'uguaglianza segue regole diverse da quelle dell'ordinamento.
Migrazione del vecchio codice
Se la classe disponeva in precedenza di numerosi operatori di confronto, li sostituisca con un <=> generato automaticamente durante la migrazione a C++20. Molto meno codice, con la stessa semantica.
Quando non utilizzare <=>
Per i tipi per i quali conta solo l'uguaglianza, e non l'ordine, fornisca soltanto operator== e operator!=, che in C++20 viene generato automaticamente.
Nota sulle prestazioni
Il compilatore può ottimizzare <=> generato automaticamente con la stessa efficienza dei confronti scritti manualmente. L'utilizzo dell'operatore spaceship non comporta overhead a runtime.
Verifica rapida
Quale categoria di tipo restituito si dovrebbe utilizzare per i tipi in virgola mobile che possono contenere NaN?
Riepilogo
L'operatore C++20 <=> genera tutti e sei gli operatori relazionali a partire da un'unica definizione. Lo generi automaticamente per confrontare i membri in ordine lessicografico. Scelga l'ordinamento forte, debole o parziale in base alla semantica del tipo.
Domande Frequenti
La lezione «Operatore di confronto a tre vie in C++20» è gratuita?
Sì — il testo completo di «Operatore di confronto a tre vie in C++20» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso C++ Academy, passa a CoddyKit PRO. Il corso C++ Academy include 4 lezioni in totale.
Cosa imparerò in «Operatore di confronto a tre vie in C++20»?
Usi l'operatore spaceship per confronti concisi e coerenti Eserciti C++ Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare C++ Academy?
Non è richiesta alcuna esperienza precedente. C++ Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.
Quanto tempo richiede la lezione «Operatore di confronto a tre vie in C++20»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione C++ Academy?
Sì. Ogni lezione C++ Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Operatori aritmetici e di confronto
- Operatori di inserimento ed estrazione dagli stream
- Operatori di indicizzazione e chiamata di funzione
- Operatore di confronto a tre vie in C++20