Почему 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()член, хотя, так что вы можете использовать это в своем коде.