次のように定義された構造体があります:
struct Vec3 {
float x, y, z;
};
std::unique
を で使用しようとしたところ、std::vector<Vec3>
次のエラーが発生しました:
説明 リソース パス 場所 タイプ 'operator==' に一致しません '__first.__gnu_cxx::__normal_iterator<_Iterator, _Container>::operator* with _Iterator = Vec3*, _Container = std::vector<Vec3, std::allocator > == __next.__gnu_cxx::__normal_iterator<_Iterator, _Container>::operator* with _Iterator = Vec3*, _Container = std::vector<Vec3, std::allocator >' ModelConverter 行 4351、外部の場所: /usr/include/c++/4.4.6/bits/stl_algo.h C/C++ の問題
私はコンパイラの素朴さの必要性を理解していますで等価演算子とその他 (この場合、*
私が意味していることはほぼ間違いなくそうではありません) がありますが、これはポリシーの問題ですか、それとも私が知らない技術的な理由があるのでしょうか? デフォルトの代入演算子があるのに、なぜデフォルトの等価演算子がないのでしょうか?
ベストアンサー1
技術的な理由はありません。衒学的に言えば、Cでは2つの構造体を で比較できないためだと言うかもしれません。==
これは良い理由です。C++に移行したときに動作が切り替わるのは自明ではありません。(おそらく、Cがそれをサポートしない理由は、フィールド単位の比較がいくつかの構造体ですが、すべてではありません。
C++ の観点から言えば、プライベート フィールドがある場合はどうなるでしょうか。デフォルトでは、技術的にはそのフィールドが公開されます (間接的ですが)。そのため、コンパイラは、プライベートまたは保護されたデータ メンバーがない場合にのみ==
を生成するのでしょうか。operator==
また、等価性の適切な定義を持たないクラス (空のクラス、状態をモデル化せずにキャッシュするクラスなど) や、デフォルトの等価性チェックが非常にわかりにくいクラス (ポインターをラップするクラス) もあります。
そして、継承があります。operator==
継承の状況で何をすべきかを決定するのは複雑で、コンパイラが間違った決定を下すのは簡単です。(たとえば、これが C++ で行われていたとしたら、==
抽象基本クラスの子孫であり、そのクラスへの参照とともに使用されている 2 つのオブジェクト間の等価性をテストすると、なぜ常に成功するのかという質問を受けるでしょう。)
基本的に、これは厄介な問題であり、コンパイラが決定したものを上書きできることを考慮しても、コンパイラが関与しない方が安全です。