上記のコードは、スタック オーバーフロー (スニッカー) が発生してプログラムがクラッシュするまで、自分自身を再帰的に呼び出します。メソッド自体(あなたが書いたもの)は等値演算子であり、本体内で明示的に再度呼び出されます。
等値演算子 ( operator==
) をオーバーライドする背後にある考え方は、等値をどのように実装するかを自分で決めることができるということです。したがって、おそらくメソッドの本体を次のようにしたいと思うでしょう:
return this->bar == other.bar;
これは、おそらくあなたが望むことをするでしょう。
C++ が等価性について「賢く」なり、自動的にメンバごとの比較を行うことを望まない理由の 1 つは、「等価性」が何を意味するかについて、C++ 標準化団体とは非常に異なる考えを持っている可能性があるためです。
例として、ポインター メンバーを持つクラスは、ポインターがまったく同じオブジェクトを指している場合にのみ等しいと見なすことができます。または、ポインター先のオブジェクトがメンバーごとに等しい場合にのみそれらが等しいと見なすことができます。または、(注: ここでは悪い習慣ですが、人々はまだそれを行っています) まだ初期化されていないため、ランダムなアドレスを指していて、それらを逆参照するとクラッシュが発生する可能性があります (「あなた」は、フラグ変数のためにこれを知っているかもしれません。しかし、C++ は、「役に立つ」逆参照を試みたときにはそうしませんでした)。