En C ++ 20, la forma en que funcionan los operadores relacionales cambió, especialmente con la introducción del <=>
operador de la nave espacial . En particular, si solo proporciona operator==
, a != b
se reescribe a !(a == b)
.
De [over.match.oper] /3.4 :
El conjunto de candidatos reescrito se determina de la siguiente manera:
- Para los operadores relacionales ([expr.rel]), los candidatos reescritos incluyen todos los candidatos no reescritos para la expresión x <=> y.
- Para los operadores relacionales ([expr.rel]) y de comparación de tres vías ([expr.spaceship]), los candidatos reescritos también incluyen un candidato sintetizado, con el orden de los dos parámetros invertidos, para cada candidato no reescrito para el expresión y <=> x.
- Para el operador! = ([Expr.eq]), los candidatos reescritos incluyen todos los candidatos no reescritos para la expresión x == y.
- Para los operadores de igualdad, los candidatos reescritos también incluyen un candidato sintetizado, con el orden de los dos parámetros invertidos, para cada candidato no reescrito para la expresión y == x.
- Para todos los demás operadores, el conjunto de candidatos reescrito está vacío.
Y [over.match.oper] / 9 :
Si se selecciona un operador reescrito == candidato por resolución de sobrecarga para un operador @, su tipo de retorno será cv bool, y x @ y se interpreta como:
- if @ is! = y el candidato seleccionado es un candidato sintetizado con un orden inverso de parámetros,! (y == x),
- de lo contrario, si @ es! =,! (x == y) ,
- de lo contrario (cuando @ es ==), y == x,
en cada caso utilizando el operador reescrito seleccionado == candidato.
Como tal, operator!=
ya no es necesaria una sobrecarga explícita para . La eliminación del operador no ha cambiado la semántica de comparación.
Todos los contenedores se han operator!=
eliminado, por lo que puedo ver (ver, por ejemplo, la sinopsis del vector ). Las únicas excepciones son los adaptadores de contenedor std::queue
y std::stack
: supongo que es para preservar la compatibilidad con versiones anteriores cuando se usa con contenedores de terceros, en caso de que los operadores de igualdad no sean simétricos.