Я дізнаюся про перевантаження оператора в C ++, і я бачу це ==
і !=
просто деякі спеціальні функції, які можна налаштувати під визначені користувачем типи. Але я хвилююся, чому потрібні два окремі визначення? Я подумав, що якщо a == b
це правда, то a != b
автоматично помилково, і навпаки, а іншої можливості немає, тому що, за визначенням, a != b
є !(a == b)
. І я не міг уявити жодної ситуації, в якій це не було правдою. Але, можливо, моя уява обмежена або я щось не знаю?
Я знаю, що я можу визначити одне з точки зору іншого, але про це я не прошу. Я також не запитую про різницю між порівнянням об'єктів за значенням чи за особою. Або два об'єкти могли бути однаковими і нерівними одночасно (це однозначно не варіант! Ці речі є взаємовиключними). Про що я прошу:
Чи є ситуації , в яких можна задавати питання про двох об'єктів чи рівні має сенс, але питати про них НЕ рівні не має сенсу? (або з точки зору користувача, або з точки зору реалізації)
Якщо такої можливості немає, то чому на Землі C ++ визначає ці два оператори як дві різні функції?
'undefined' != expression
завжди є правдивим (або хибним, або невизначеним), незалежно від того, чи можна оцінити вираз. У цьому випадку a!=b
повертається правильний результат за визначенням, але !(a==b)
не вдається, якщо b
його неможливо оцінити. (Або зайняти багато часу, якщо оцінка b
дорога).
(NaN != NaN) == true