1. ホーム
  2. c++

[解決済み】なぜC++コンパイラはoperator==とoperator!=を定義しないのでしょうか?

2022-03-26 17:51:43

質問

私はコンパイラにできるだけ多くの仕事をさせるのが好きです。 単純なクラスを書く場合、コンパイラは次のようなものを「無料」で提供してくれます。

  • デフォルトの(空の)コンストラクタ
  • コピーコンストラクタ
  • デストラクタ
  • 代入演算子( operator= )

しかし、比較演算子を与えることはできないようです。 operator== または operator!= . 例えば、以下のようになります。

class foo
{
public:
    std::string str_;
    int n_;
};

foo f1;        // Works
foo f2(f1);    // Works
foo f3;
f3 = f2;       // Works

if (f3 == f2)  // Fails
{ }

if (f3 != f2)  // Fails
{ }

これには何か理由があるのでしょうか? なぜメンバーごとに比較を行うことが問題なのでしょうか? もちろん、クラスがメモリを確保する場合は注意が必要ですが、単純なクラスであればコンパイラがやってくれるのではないでしょうか?

どのように解決するのですか?

コンパイラは、ポインタの比較をしたいのか、深い(内部)比較をしたいのか、わからないでしょう。

実装しないで、プログラマー自身にやらせた方が安全です。そうすれば、プログラマーは好きなように仮定することができます。