Я учусь о перегрузках операторов в C ++, и я вижу , что ==и !=просто некоторые специальные функции , которые могут быть настроены для определенного пользователя типов. Однако меня беспокоит, почему нужны два отдельных определения? Я думал, что если a == bэто правда, то a != bавтоматически ложно, и наоборот, и нет другой возможности, потому что, по определению, a != bесть !(a == b). И я не мог представить себе ситуацию, в которой это было бы неправдой. Но, может быть, мое воображение ограничено или я чего-то не знаю?
Я знаю, что могу определить одно в терминах другого, но я не об этом. Я также не спрашиваю о разнице между сравнением объектов по значению или идентичности. Или два объекта могут быть равными и не равными одновременно (это определенно не вариант! Эти вещи взаимоисключающие). Я спрашиваю о следующем:
Возможна ли ситуация, когда задавать вопросы о том, что два объекта равны, имеет смысл, но спрашивать о том, что они не равны, не имеет смысла? (либо с точки зрения пользователя, либо с точки зрения исполнителя)
Если такой возможности нет, то почему в C ++ эти два оператора определены как две разные функции?
'undefined' != expressionэто всегда true (или false, или undefined), независимо от того, можно ли вычислить выражение. В этом случае a!=bвернул бы правильный результат согласно определению, но !(a==b)потерпел бы неудачу, если bне может быть оценен. (Или займет много времени, если оценка bстоит дорого).
(NaN != NaN) == true