1. ホーム
  2. c++

[解決済み】==と!=は相互に依存しあっている?

2022-03-31 11:32:02

質問

C++で演算子のオーバーロードについて学んでいるのですが、以下のようなことがわかります。 ==!= は、ユーザー定義型のためにカスタマイズできる特殊な関数に過ぎません。しかし、私の懸念は、なぜ 2つの別々の の定義が必要なのでしょうか?私は、もし a == b が真であれば a != b は自動的に偽となり、その逆もまた然りで、それ以外の可能性はありません、なぜなら、定義上 a != b!(a == b) . そして、これが真実でない状況を想像することができなかった。しかし、私の想像力が乏しいのか、それとも私が何かについて無知なのでしょうか。

一方を他方から見て定義できることは知っていますが、私が尋ねているのはそういうことではありません。また、価値で比較するのか、同一性で比較するのかの違いについても尋ねていません。また、2つのオブジェクトが同時に等しく、かつ非等価である可能性があるかどうかについても尋ねていません(これは絶対に選択肢ではありません!これらのことは相互に排他的です)。私が尋ねているのは、このことだ。

2つのオブジェクトが等しいことを質問するのは意味があるが、2つのオブジェクトについて質問するのは意味がない、という状況はあり得るだろうか? ない は意味をなさないのでしょうか?(ユーザーの視点でも、実装者の視点でも)。

もしそのような可能性がないのであれば、一体なぜC++はこの2つの演算子を2つの異なる関数として定義しているのでしょうか?

どうすれば解決するの?

あなたは ない を自動的に書き換えるような言語が欲しい。 a != b として !(a == b) いつ a == b 以外のものを返します。 bool . そして、そのような動作をさせる理由はいくつかあります。

エクスプレッションビルダーオブジェクトがあり、そこで a == b は比較を行わず、また比較を行うことを意図せず、単に a == b .

遅延評価を行うことができます。 a == b は直接比較を行わず、また行うことを意図していませんが、その代わりに何らかの lazy<bool> に変換することができます。 bool 暗黙的に、あるいは後で明示的に、実際に比較を実行します。式ビルダーオブジェクトと組み合わせることで、評価前に式を完全に最適化できる可能性があります。

を使用することができます。 optional<T> テンプレートクラスで、与えられたオプションの変数 tu を許可したい場合は t == u を返します。 optional<bool> .

思いつかないものがまだまだあるかもしれません。そして、これらの例では、操作 a == ba != b はどちらも意味を持ちますが、やはり a != b は同じものではありません。 !(a == b) そのため、別の定義が必要です。