c++ - Como o operador de comparação de três vias é diferente da subtração?




comparison-operators c++20 (2)

Aqui estão alguns casos para os quais a subtração não funciona:

  1. tipos unsigned .
  2. Operandos que causam estouro de número inteiro.
  3. Tipos definidos pelo usuário que não definem operator - (talvez porque não seja significativo - pode-se definir uma ordem sem definir uma noção de distância).

Suspeito que esta lista não seja exaustiva.

Obviamente, pode-se encontrar soluções alternativas para pelo menos os nºs 1 e 2. Mas a intenção do operator <=> é encapsular essa feiura.

Há um novo operador de comparação <=> no C ++ 20. No entanto, acho que na maioria dos casos uma simples subtração funciona bem:

int my_strcmp(const char *a, const char *b) {
    while (*a == *b && *a != 0 && *b != 0) {
        a++, b++;
    }
    // Version 1
    return *a - *b;
    // Version 2
    return *a <=> *b;
    // Version 3
    return ((*a > *b) - (*a < *b));
}

Eles têm o mesmo efeito. Eu realmente não consigo entender a diferença.


Há algumas respostas significativas aqui sobre a diferença, mas Herb Sutter em seu artigo diz especificamente:

<=> é para implementadores de tipo: Código de usuário (incluindo código genérico) fora da implementação de um operador <=> quase nunca deve invocar um <=> diretamente (como já descoberto como uma boa prática em outros idiomas);

Portanto, mesmo que não houvesse diferença, o ponto do operador é diferente: ajudar os escritores de classe a gerar operadores de comparação.

A principal diferença entre o operador de subtração e o operador "nave espacial" (de acordo com a proposta de Sutter) é que o operator- sobrecarga fornece um operador de subtração, enquanto o operator<=> sobrecarga operator<=> :

  • fornece os 6 principais operadores de comparação (mesmo se você declarar o operador como default : sem código para escrever!);
  • declara se sua turma é comparável, se é ordenável e se a ordem é total ou parcial (forte / fraca na proposta de Sutter);
  • permite comparações heterogêneas: você pode sobrecarregá-lo para comparar sua classe com qualquer outro tipo.

Outras diferenças estão no valor de retorno: o operator<=> retornaria um enum de uma classe, a classe especifica se o tipo é classificável e se a classificação é forte ou fraca. O valor de retorno seria convertido para -1, 0 ou 1 (embora Sutter deixe espaço para o tipo de retorno também indicar distância, como o strcmp ). De qualquer forma, assumindo o valor de retorno -1, 0, 1, finalmente obteremos uma verdadeira função de sinal em C ++ ! ( signum(x) == x<=>0 )





spaceship-operator