В С++ 14 ассоциативные контейнеры, похоже, изменились с С++ 11 – [associative.reqmts]/13 говорит:
Шаблоны функций-членов
find
,count
,lower_bound
,upper_bound
иequal_range
не должны участвовать в разрешении перегрузки, если не существует типCompare::is_transparent
.
Какова цель создания "прозрачного" компаратора?
С++ 14 также предоставляет библиотечные шаблоны, подобные этому:
template <class T = void> struct less {
constexpr bool operator()(const T& x, const T& y) const;
typedef T first_argument_type;
typedef T second_argument_type;
typedef bool result_type;
};
template <> struct less<void> {
template <class T, class U> auto operator()(T&& t, U&& u) const
-> decltype(std::forward<T>(t) < std::forward<U>(u));
typedef *unspecified* is_transparent;
};
Так, например, std::set<T, std::less<T>>
не будет иметь прозрачного компаратора, но std::set<T, std::less<>>
будет иметь его.
Какую проблему это решает, и это влияет на работу стандартных контейнеров? Например, параметры шаблона std::set
все еще Key, Compare = std::less<Key>, ...
, поэтому набор по умолчанию теряет свои члены find
, count
и т.д.?