Estou aprendendo sobre a sobrecarga de operadores em C ++ e vejo isso ==
e !=
são simplesmente algumas funções especiais que podem ser personalizadas para tipos definidos pelo usuário. Minha preocupação é, porém, por que são necessárias duas definições separadas ? Eu pensei que se a == b
é verdade, então a != b
é automaticamente falsa e vice-versa, e não há outra possibilidade, porque, por definição, a != b
é !(a == b)
. E eu não conseguia imaginar nenhuma situação em que isso não fosse verdade. Mas talvez minha imaginação seja limitada ou eu ignore alguma coisa?
Eu sei que posso definir um em termos do outro, mas não é sobre isso que estou perguntando. Também não estou perguntando sobre a distinção entre comparar objetos por valor ou por identidade. Ou se dois objetos podem ser iguais e não iguais ao mesmo tempo (isso definitivamente não é uma opção! Essas coisas são mutuamente exclusivas). O que estou perguntando é o seguinte:
Existe alguma situação possível em que fazer perguntas sobre dois objetos serem iguais faz sentido, mas perguntar sobre eles não serem iguais não faz sentido? (da perspectiva do usuário ou da perspectiva do implementador)
Se não existe essa possibilidade, por que C ++ na Terra esses dois operadores são definidos como duas funções distintas?
'undefined' != expression
é sempre verdadeiro (ou falso ou indefinido), independentemente de a expressão poder ser avaliada. Nesse caso a!=b
, retornaria o resultado correto conforme a definição, mas !(a==b)
falharia se b
não puder ser avaliado. (Ou gaste muito tempo se a avaliação b
for cara).
(NaN != NaN) == true