Em C ++ 20, a maneira como os operadores relacionais trabalham foi alterada, principalmente com a introdução do <=>
operador de espaçonave . Em particular, se você fornecer apenas operator==
, a != b
será reescrito para !(a == b)
.
De [over.match.oper] /3.4 :
O conjunto de candidatos reescritos é determinado da seguinte maneira:
- Para os operadores relacionais ([expr.rel]), os candidatos reescritos incluem todos os candidatos não reescritos para a expressão x <=> y.
- Para os operadores relacionais ([expr.rel]) e de comparação de três vias ([expr.spaceship]), os candidatos reescritos também incluem um candidato sintetizado, com a ordem dos dois parâmetros revertidos, para cada candidato não reescrito para o expressão y <=> x.
- Para o operador! = ([Expr.eq]), os candidatos reescritos incluem todos os candidatos não reescritos para a expressão x == y.
- Para os operadores de igualdade, os candidatos reescritos também incluem um candidato sintetizado, com a ordem dos dois parâmetros revertidos, para cada candidato não reescrito para a expressão y == x.
- Para todos os outros operadores, o conjunto de candidatos reescritos está vazio.
E [over.match.oper] / 9 :
Se um operador reescrito == candidato for selecionado por resolução de sobrecarga para um operador @, seu tipo de retorno será cv bool e x @ y será interpretado como:
- se @ for! = e o candidato selecionado for um candidato sintetizado com ordem inversa de parâmetros,! (y == x),
- caso contrário, se @ for! =,! (x == y) ,
- caso contrário (quando @ for ==), y == x,
em cada caso, usando o operador reescrito selecionado == candidato.
Como tal, uma sobrecarga explícita para operator!=
não é mais necessária. A remoção do operador não mudou a semântica da comparação.
Todos os contêineres foram operator!=
removidos, até onde eu sei (verifique, por exemplo, a sinopse do vetor ). As únicas exceções são os adaptadores de contêiner std::queue
e std::stack
: meu palpite é que é para preservar a compatibilidade com versões anteriores quando usado com contêineres de terceiros, caso os operadores de igualdade não sejam simétricos.
Não precisamos mais de uma biblioteca fornecida
operator!=
. O fornecimentooperator==
permite que o compilador faça algum malabarismo e avaliea != b
em termos dea == b
, tudo por conta própria.std::type_info
e muitos outros tipos de bibliotecas foramoperator!=
removidos como parte do P1614 - The Mothership Landed .fonte