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

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[] возвращает a T&. То есть, он возвращает ссылку на тег value это связано с key. Но что делать, если нет key на map? Что мы должны вернуть? Нет такой вещи, как" нулевая ссылка", и выбрасывание исключения было бы раздражающим.

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

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

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

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

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

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