Uczę się o przeciążenia operatora w C ++, i widzę, że ==
i !=
są po prostu pewne specjalne funkcje, które mogą być dostosowane do typów zdefiniowanych przez użytkownika. Martwię się jednak, dlaczego potrzebne są dwie osobne definicje? Myślałem, że jeśli a == b
to prawda, a != b
to automatycznie jest fałszem i odwrotnie, i nie ma innej możliwości, ponieważ z definicji tak a != b
jest !(a == b)
. I nie wyobrażałem sobie żadnej sytuacji, w której to nie byłoby prawdą. Ale może moja wyobraźnia jest ograniczona, czy czegoś nie wiem?
Wiem, że mogę zdefiniować jedno w kategoriach drugiego, ale nie o to pytam. Nie pytam też o rozróżnienie między porównywaniem obiektów według wartości lub tożsamości. Lub czy dwa obiekty mogą być równe i nierównomierne jednocześnie (to zdecydowanie nie jest opcja! Te rzeczy wzajemnie się wykluczają). Pytam o to:
Czy jest jakakolwiek sytuacja, w której zadawanie pytań o równość dwóch przedmiotów ma sens, ale pytanie o nierówność między nimi nie ma sensu? (z perspektywy użytkownika lub z perspektywy implementatora)
Jeśli nie ma takiej możliwości, to dlaczego na Ziemi C ++ mają te dwa operatory zdefiniowane jako dwie odrębne funkcje?
'undefined' != expression
zawsze jest to prawda (lub fałsz, lub niezdefiniowane), niezależnie od tego, czy wyrażenie może być ocenione. W takim przypadku a!=b
zwróci prawidłowy wynik zgodnie z definicją, ale !(a==b)
nie powiedzie się, jeśli nie będzie b
można go ocenić. (Lub poświęć dużo czasu, jeśli ocena b
jest droga).
(NaN != NaN) == true