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