Ответ 1
Ассоциативные контейнеры только открывают пару (ключ, значение) как std::pair<const key_type, mapped_type>
, поэтому дополнительная константа в типе ключа является излишней.
Я переключил свой код с std:: map на std:: unordered_map, где это необходимо. В std:: map я обычно пишу следующее, чтобы убедиться, что ключ не может быть изменен:
std::map<const std::string, int>
Честно говоря, я никогда не проверял, была ли эта константа какой-либо ценности. Это всегда скомпилировано и работает с g++.
Теперь, с std:: unordered_map, следующее соединение не связано с g++ 4.5.1.
std::unordered_map<const std::string, std::string> m;
m["foo"] = "bar";
с этой ссылкой:
Undefined символы:
"std::hash<std::basic_string<char, std::char_traits<char>, std::allocator<char> > const>::operator()(std::basic_string<char, std::char_traits<char>, std::allocator<char> >) const"
, на который ссылаются:
Исправить это просто, удалить const, но кроме того, существует ли даже точка в STL с любым из классов ассоциативных контейнеров для использования типа ключа const? Нет ли методов, позволяющих получить ссылку на ключ для любого ассоциативного типа?
Ассоциативные контейнеры только открывают пару (ключ, значение) как std::pair<const key_type, mapped_type>
, поэтому дополнительная константа в типе ключа является излишней.