Почему 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[]
заключается в том, чтобы добавить ключ, если он не существует.