在C ++ 14中,关联容器似乎已从C ++ 11进行了更改– [associative.reqmts] / 13说:
成员函数模板
find
,count
,lower_bound
,upper_bound
,并且equal_range
不得,除非类型参与重载决议Compare::is_transparent
存在。
使比较器“透明”的目的是什么?
C ++ 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
等会员?