Я всегда думал, что стандарт требует неспецифического шаблона для std::equal_to<T>
звонить T::operator==
, но я заметил описание на cppreference.com почти подразумевает, что это наоборот; конечно это не упоминает это как требование. Я также проверил проект стандарта C33 11 N3337 и не нашел там никаких гарантий.
Если вы создаете класс с operator==
ты бы надеялся, что он привыкнет при любых обстоятельствах.
Я не могу честно придумать способ реализации std::equal_to
это не сработает, но я что-то упустил?
Гарантируется ли вызов std :: equal_to?
operator ==
по умолчанию?
да.
Если не специализированный, equal_to
оператор вызова будет вызывать operator ==
, Из пункта 20.8.5 стандарта C ++ 11:
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
.
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==
Перегрузка, определенная для него как левый операнд, будет использоваться.