Почему в ассоциативном массиве можно использовать только непостоянные карты
образом?
Поскольку эти операторы возвращают ссылку на объект, связанный с конкретным ключом. Если контейнер еще не содержит такого объекта, operator[]
вставляет объект по умолчанию. Теперь, если контейнер постоянный, вы не можете вставлять в него какие-либо объекты и не можете возвращать ссылку на несуществующие объекты, поэтому эти операторы доступны только для неконстантных контейнеров.
Создание исключения в этом случае, конечно, возможно, но это не лучший способ приблизиться к довольно общим случаям, когда объект для данного ключа не существует. По сути, исключения являются чрезвычайно дорогими и предназначены для исключительных ситуаций, а вышеперечисленное - нет, поэтому оно того не стоит.
Лучшим способом было бы вернуть итератор, но тогда пользователь должен будет проверить, не является ли он "концом", что сделает случай использования похожим на вызов find ()
, поэтому бесполезным. Также возможен возврат итераторов или указателей для контейнеров только для констант, но это немного нарушает семантику и сбивает с толку.