En C++14, conteneurs associatifs semblent avoir changé depuis C++11 – [associatif.reqmts]/13, dit:
La fonction de membre de modèles d'
find
,count
,lower_bound
,upper_bound
, etequal_range
ne doit pas participer à la résolution de surcharge, à moins que le typeCompare::is_transparent
existe.
Quel est le but de faire une comparaison "transparent"?
C++14 fournit également des modèles de bibliothèque comme ceci:
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;
};
Ainsi, par exemple, std::set<T, std::less<T>>
serait de ne pas avoir un comparateur transparent, mais std::set<T, std::less<>>
permettrait d' en avoir un.
Quel problème est-ce à résoudre, et elle le fait de changer la façon dont les conteneurs standard de travail? Par exemple, les paramètres du modèle de std::set
sont encore en Key, Compare = std::less<Key>, ...
, donc l'ensemble par défaut de perdre son find
, count
, etc. les membres?