Почему 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.

Ответ 1

operator[] на карте возвращается значение с указанным ключом или создает новый инициализируемый значением элемент для этого ключа, если он еще не присутствует, поэтому это было бы невозможно.

Если operator[] будет иметь перегрузку const, добавление элемента не будет работать.

Это отвечает на вопрос. Альтернативы:

Для С++ 03 - вы можете использовать итераторы (это const и не const в сочетании с find). В С++ 11 вы можете использовать метод at.

Ответ 2

В С++ 11 есть std::map::at, который предлагает const и non-const доступ.

В отличие от operator[] он генерирует исключение std::out_of_range, если элемент не находится на карте.

Ответ 3

Эти ответы верны в том, что operator[] имеет семантику, чтобы добавить ключ, если он не существует, но я хотел бы добавить еще одну перспективу:

Обратите внимание, как operator[] возвращает T&. То есть, он возвращает ссылку на value, которая связана с key. Но что, если в map нет key? Что мы должны вернуть? Нет такой вещи, как "нулевая ссылка", и выброс исключения будет раздражать.

Это была бы одна веская причина для отсутствия operator[] const. Что бы вы вернули пользователю, если вы не могли добавить что-либо к map (потому что оператор const), но они ищут элемент, который не существует? Хорошим решением этой проблемы является отсутствие operator[] const.

Ответ 4

(не const) operator[] создает ключ, если он не существует.

Версия этого оператора const, если она существовала, должна иметь разную семантику, так как она не сможет добавить новый ключ.

Я уверен, что вы согласитесь, что наличие перегрузок const и не const с существенно различной семантикой будет банкой червей. Поэтому не предоставляется версия const.

Однако существует член const find(), поэтому вы можете использовать его в своем коде.

Ответ 5

Поскольку семантика operator[] заключается в том, чтобы добавить ключ, если он не существует.