私は C++ の演算子オーバーロードについて学んでいますが、==
と は!=
単にユーザー定義型用にカスタマイズできる特別な関数であることがわかりました。しかし、なぜ2 つの別々のa == b
定義が必要なのかが気になります。が真であれば は自動的に偽になり、その逆も同様で、定義により であるa != b
ため、他の可能性はないと考えていました。そして、これが真でない状況を想像できませんでした。しかし、おそらく私の想像力が限られているか、何かについて無知なのでしょうか?a != b
!(a == b)
どちらか一方を他方の観点から定義できることはわかっていますが、これは私が尋ねていることではありません。また、オブジェクトを値で比較するか、同一性で比較するかの違いについても尋ねていません。または、2 つのオブジェクトが同時に等しい場合と等しくない場合があるかどうかについても尋ねていません (これは絶対にあり得ません。これらは相互に排他的です)。私が尋ねているのは次のことです。
2 つのオブジェクトが等しいかどうかを尋ねることは意味があるが、等しくないかどうかを尋ねることは意味がないという状況は考えられますか? (ユーザーの観点からも、実装者の観点からも)
そのような可能性がないのであれば、一体なぜ C++ ではこれら 2 つの演算子が 2 つの異なる関数として定義されているのでしょうか?
ベストアンサー1
が 以外のものを返すときに、言語が自動的にを として書き換えることは望ましくないでしょう。そうさせる理由はいくつかあります。a != b
!(a == b)
a == b
bool
式ビルダー オブジェクトがある場合があります。a == b
は比較を実行せず、 を表す式ノードを構築するだけですa == b
。
遅延評価を行うこともできます。遅延評価では、 はa == b
直接比較を実行せず、また直接比較を実行することを意図していませんが、代わりに、後で実際に比較を実行するために暗黙的または明示的lazy<bool>
に に変換できる何らかの を返しますbool
。式ビルダー オブジェクトと組み合わせて、評価前に完全な式最適化を可能にすることもできます。
オプションの変数とoptional<T>
が与えられたカスタム テンプレート クラスがある場合、 を許可しながら を返すようにすることができます。t
u
t == u
optional<bool>
おそらく、私が考えていなかったことが他にもあるでしょう。また、これらの例ではa == b
、 と の演算はa != b
どちらも意味をなしますが、 はa != b
と同じではない!(a == b)
ため、別の定義が必要です。