В С++ 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 и т.д.?