Sto imparando circa l'overloading degli operatori in C ++, e vedo che ==
e !=
sono semplicemente alcune funzioni speciali che possono essere personalizzati per i tipi definiti dall'utente. La mia preoccupazione è, tuttavia, perché sono necessarie due definizioni separate ? Ho pensato che se a == b
è vero, allora a != b
è automaticamente falso, e viceversa, e non c'è altra possibilità, perché, per definizione, lo a != b
è !(a == b)
. E non riuscivo a immaginare alcuna situazione in cui ciò non fosse vero. Ma forse la mia immaginazione è limitata o ignoro qualcosa?
So di poter definire l'uno in termini di altro, ma non è questo ciò di cui mi sto chiedendo. Inoltre, non sto chiedendo la distinzione tra confrontare oggetti per valore o per identità. O se due oggetti potrebbero essere uguali e non uguali allo stesso tempo (questa non è sicuramente un'opzione! Queste cose si escludono a vicenda). Quello che sto chiedendo è questo:
C'è qualche situazione possibile in cui ha senso porre domande su due oggetti uguali, ma non ha senso chiederle se non sono uguali? (dal punto di vista dell'utente o dal punto di vista dell'implementatore)
Se non esiste tale possibilità, perché sulla Terra il C ++ ha questi due operatori definiti come due funzioni distinte?
'undefined' != expression
è sempre vero (o falso o indefinito), indipendentemente dal fatto che l'espressione possa essere valutata. In questo caso a!=b
restituirebbe il risultato corretto secondo la definizione, ma !(a==b)
fallirebbe se non fosse b
possibile valutarlo. (O impiega molto tempo se la valutazione b
è costosa).
(NaN != NaN) == true