2

私はいつも、標準がstd::equal_to<T>呼び出すために特殊化されていないテンプレートを必要としていると思っていましたが、cppreference.comT::operator==の説明は、ほとんど逆であることに気づきました。確かにそれは要件として言及していません。また、C ++ 11ドラフト標準N3337も確認しましたが、保証も見つかりませんでした。

を使用してクラスを作成する場合はoperator==、すべての状況で使用されることを期待します。

このように機能しない実装方法を正直に考えることはできませんがstd::equal_to、何かが足りませんか?

4

2 に答える 2

7

std :: equal_toはoperator ==デフォルトで呼び出すことが保証されていますか?

はい

特殊化されていない場合、equal_toの呼び出し演算子はを呼び出しoperator ==ます。C ++ 11規格のパラグラフ20.8.5から:

1ライブラリは、言語(5.9、5.10)のすべての比較演算子に基本的な関数オブジェクトクラスを提供します。

template <class T> struct equal_to 
{
    bool operator()(const T& x, const T& y) const;
    typedef T first_argument_type;
    typedef T second_argument_type;
    typedef bool result_type;
};

2は。をoperator()返しますx == y

于 2013-02-27T21:08:53.567 に答える
2

std::equal_toと定義されている:

template <class T> struct equal_to {
  bool operator()(const T& x, const T& y) const;
  typedef T first_argument_type;
  typedef T second_argument_type;
  typedef bool result_type;
};

operator()を返しますx == y

そうです、が左オペランドとしてオーバーロードが定義されてTいるクラスタイプの場合、それが使用されます。operator==

于 2013-02-27T21:09:02.500 に答える