Operador de comparação de três vias no C++20
Use o operador spaceship para comparações concisas e consistentes
Operador de comparação de três vias no C++20 é uma aula grátis de C++ Academy no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de C++ Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de C++ Academy inclui 4 aulas no total.
O operador spaceship <=>
O C++20 introduziu o operador de comparação de três vias <=>. Um único operador fornece ao compilador tudo de que ele precisa para gerar os seis operadores relacionais.
Tipos de retorno: três categorias
O tipo de retorno depende da força da ordenação:
std::strong_ordering— valores equivalentes distinguíveisstd::weak_ordering— valores equivalentes, mas distinguíveis (por exemplo, sem diferenciar maiúsculas de minúsculas)std::partial_ordering— alguns valores são incomparáveis (por exemplo, NaN)
Comparação gerada por padrão
O padrão mais comum: peça ao compilador para gerar <=> comparando os membros lexicograficamente.
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-generatedOs seis de uma vez
Definir <=> por padrão também define == por padrão. Juntos, eles geram !=, <, <=, >, >= — os seis em uma única linha.
Implementação personalizada de <=>
Escreva o corpo manualmente para implementar uma lógica de comparação personalizada.
std::strong_ordering operator<=>(const Person& other) const {
if (auto c = name <=> other.name; c != 0) return c;
return age <=> other.age;
}Usando o resultado
O resultado de <=> pode ser comparado com o literal 0 para realizar a verificação booleana desejada.
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";Ponto flutuante e partial_ordering
Para números de ponto flutuante, use std::partial_ordering para lidar com NaN — uma comparação com NaN produz unordered.
struct Measurement {
double value;
std::partial_ordering operator<=>(const Measurement&) const = default;
};Exemplo de ordenação fraca
Use a ordenação fraca quando os valores puderem ser distinguíveis, mas forem comparados como iguais — por exemplo, strings que não diferenciam maiúsculas de minúsculas.
== personalizado de forma independente
Você pode definir <=> por padrão e escrever um == personalizado — às vezes, as regras de igualdade são diferentes das regras de ordenação.
Migrando código antigo
Se sua classe anteriormente tinha vários operadores de comparação, substitua-os por um <=> gerado por padrão ao migrar para o C++20. Muito menos código, com a mesma semântica.
Quando não usar <=>
Para tipos nos quais apenas a igualdade importa (sem ordenação), forneça somente operator== e operator!= (que é sintetizado automaticamente no C++20).
Observação sobre desempenho
O compilador pode otimizar um <=> gerado por padrão com a mesma eficiência das comparações escritas manualmente. Usar o spaceship não gera sobrecarga em tempo de execução.
Verificação rápida
Qual categoria de retorno uma comparação deve usar para tipos de ponto flutuante que podem conter NaN?
Resumo
O operador <=> do C++20 gera os seis operadores relacionais a partir de uma única definição. Defina-o por padrão para comparar os membros lexicograficamente. Escolha a ordenação forte, fraca ou parcial com base na semântica do seu tipo.
Perguntas Frequentes
A aula “Operador de comparação de três vias no C++20” é grátis?
Sim — o texto completo de “Operador de comparação de três vias no C++20” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de C++ Academy, atualize para CoddyKit PRO. O curso de C++ Academy inclui 4 aulas no total.
O que vou aprender em “Operador de comparação de três vias no C++20”?
Use o operador spaceship para comparações concisas e consistentes Você pratica C++ Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar C++ Academy?
Nenhuma experiência prévia é necessária. C++ Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.
Quanto tempo leva a aula “Operador de comparação de três vias no C++20”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de C++ Academy?
Sim. Cada aula de C++ Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Operadores aritméticos e de comparação
- Operadores de inserção e extração de fluxos
- Operadores de subscrito e chamada de função
- Operador de comparação de três vias no C++20