Причина в том, что семантика std::map
утверждает, что если вы пытаетесь получить доступ к элементу по ключу, который не существует, ключ создается с помощью элемента, созданного по умолчанию. Другими словами m[0]
создаст int в местоположении 0, если он еще не существует. Очевидно, что это не совместимо с константной картой.
Вы могли бы сказать «ну, сделайте константную версию operator[]
и не делайте этого!», Но есть две проблемы: разница в семантике будет неочевидной и сбивающей с толку, и не совсем понятно, что должно произойти, если вы попытаетесь получить доступ к ключу, который не существует (сгенерировать исключение?).
Вместо этого вам следует использовать метод find()
на карте, который вернет итератор, указывающий на искомую пару ключ / значение. Поиск точно такой же эффективный, как и operator[]
, он может использоваться на константных картах (в этом случае возвращая константный итератор), и он вернет итератор end()
, если ключ не существует.