私はコンパイラーにできる限り多くの仕事をさせてくれるという大ファンです。単純なクラスを作成する場合、コンパイラーは以下を「無料」で提供できます。
- デフォルトの(空の)コンストラクター
- コピーコンストラクタ
- デストラクタ
- 代入演算子(
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
{ }
これには正当な理由がありますか?メンバーごとの比較の実行が問題になるのはなぜですか?もちろん、クラスがメモリを割り当てる場合は注意が必要ですが、単純なクラスの場合は、コンパイラがこれを実行できますか?
==
デフォルトの自動割り当て(=
)があるのと同じように、デフォルトの自動を持たないのは間違いであると指摘しました。(ロジックがために両方を適用するためのポインタについての引数が矛盾している=
と==
、だけではなく、秒)。