Почему std:: map не имеет доступа к const?
объявление для оператора [] на std:: map таково:
T& operator[] ( const key_type& x );
есть ли причина, почему это не так?
T& operator[] ( const key_type& x );
const T& operator[] const ( const key_type& x );
потому что это было бы невероятно полезно в любое время, когда вам нужно получить доступ к карте членов в методе const.
5 ответов:
operator[]
в карте возвращает значение по указанному ключу или создает новый инициализированный значением элемент для этого ключа, если он еще не присутствует, поэтому это было бы невозможно.если
operator[]
будетconst
перегрузка, добавление элемента не будет работать.это ответ на вопрос. Альтернативы:
на C++03 - вы можете использовать итераторы (это
const
и неconst
в сочетании сfind
). В C++11 можно использоватьat
метод.
по состоянию на C++11 есть
std::map::at
который предлагает доступ к const и non-const.В отличие от
operator[]
появитсяstd::out_of_range
исключение, если элемент отсутствует на карте.
эти ответы верны в том, что
operator[]
имеет семантику, чтобы добавить ключ, если он не существует, но я хотел бы добавить еще одну перспективу:обратите внимание, как
operator[]
возвращает aT&
. То есть, он возвращает ссылку на тегvalue
это связано сkey
. Но что делать, если нетkey
наmap
? Что мы должны вернуть? Нет такой вещи, как" нулевая ссылка", и выбрасывание исключения было бы раздражающим.это было бы одной веской причиной ибо нет
operator[] const
. Что бы вы вернули Пользователю, если бы не смогли ничего добавить кmap
(потому что операторconst
), но они ищут элемент, который не существует? Хорошим решением этой проблемы является нетoperator[] const
.
(не
const
)operator[]
создает ключ, если он не существует.The
const
версия этого оператора, если бы она существовала, должна была бы иметь другую семантику, так как она не могла бы добавить новый ключ.Я уверен, вы согласитесь, что имея
const
и неconst
перегрузки со значительно отличающейся семантикой были бы банкой червей. Поэтому нетconst
версия предоставлена.есть const
find()
член, хотя, так что вы можете использовать это в своем коде.