Рассмотрим std::map
класс в STL:
template < class Key, // map::key_type
class T, // map::mapped_type
class Compare = less<Key>, // map::key_compare
class Alloc = allocator<pair<const Key,T> > // map::allocator_type
> class map;
Итераторы std::map
возвращают объекты типа
std::pair<const key_type, T>
Важно отметить, что первый член пары - const
. Это означает, что следующее ссылочное присвоение является недействительным .
std::pair<key_type, T>& reference = *map_iterator; // Incorrect, key_type is not const
std::pair<const key_type, T>& reference = *map_iterator; // Correct
Однако допустимо следующее выражение :
const std::pair<key_type, T>& reference = *map_iterator; // Correct, const reference is okay
Таким образом, по некоторому механизму объекты типа std::pair<const key_type, T>
могут ссылаться ссылкой типа const std::pair<key_type, T>
. Это логически желательно (поскольку const
ness std::pair
подразумевает const
ness обоих членов first
и second
, что совместимо с std::pair<const key_type, T>
).
Однако мне интересно знать, какой механизм реализации C ++ делает эту совместимость возможной. Я уверен, что есть способы реализации std :: pair, где два указанных выше ссылочных типа не будут совместимы.