Смотрю на описание member_types-ов std::map, и вижу там при объявлении std::map<Key,T> следующее:
mapped_type = T
value_type = std::pair<const Key,T>
Мне одному кажется, что по хорошему должно быть вовсе value_type = T и, соответственно, mapped_type = std::pair<const Key,T>? В чём логика нынешней структуры std::map?