0Pricing
C++ Academy · Aula

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

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

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

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

  1. Operadores aritméticos e de comparação
  2. Operadores de inserção e extração de fluxos
  3. Operadores de subscrito e chamada de função
  4. Operador de comparação de três vias no C++20
← Voltar para C++ Academy