[解決済み】なぜ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
{ }
これには何か理由があるのでしょうか? なぜメンバーごとに比較を行うことが問題なのでしょうか? もちろん、クラスがメモリを確保する場合は注意が必要ですが、単純なクラスであればコンパイラがやってくれるのではないでしょうか?
どのように解決するのですか?
コンパイラは、ポインタの比較をしたいのか、深い(内部)比較をしたいのか、わからないでしょう。
実装しないで、プログラマー自身にやらせた方が安全です。そうすれば、プログラマーは好きなように仮定することができます。
関連
-
[解決済み】C++ - 解放されるポインタが割り当てられていないエラー
-
[解決済み] [Solved] Error C1083: Cannot open include file: 'stdafx.h'
-
[解決済み】C++ - 適切なデフォルトコンストラクタがない [重複]。
-
[解決済み] とは何ですか! (not not)演算子とは何ですか?
-
[解決済み] using namespace std;」はなぜバッドプラクティスだと言われるのですか?
-
[解決済み] C言語では「?」演算子は何をするのですか?
-
[解決済み】C/C++の"-->"演算子とは何ですか?
-
[解決済み】JavaScriptの比較では、どちらの等号演算子(== vs ===)を使うべきですか?
-
[解決済み】Pythonに三項条件演算子はありますか?
-
[解決済み】なぜJavaの+=, -=, *=, /=複合代入演算子はキャスティングを必要としないのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++エラー。アーキテクチャ x86_64 に対して未定義のシンボル
-
[解決済み】Visual Studio 2015で「非標準の構文; '&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】LLVMで暗黙のうちに削除されたコピーコンストラクタの呼び出し
-
[解決済み] error: 'ostream' does not name a type.
-
[解決済み] 既に.objで定義されている-二重包含はない
-
[解決済み】リンカーエラーです。"リンカ入力ファイルはリンクが行われていないため未使用"、そのファイル内の関数への未定義参照
-
[解決済み】ファイルから整数を読み込んで配列に格納する C++ 【クローズド
-
[解決済み】1つ以上の多重定義されたシンボルが見つかる
-
[解決済み] 解決済み] `pthread_create' への未定義の参照 [重複] [重複
-
[解決済み] gdbを使用してもデバッグシンボルが見つからない