C++03 には、 map::operator[] const がなくて
切実にほしかったのですが、 C++0x では map::at メンバ関数が追加されるようです。
namespace std { template <class Key, class T, class Compare = less<Key>, class Allocator = allocator<pair<const Key, T> > > class map { public: ... // 23.3.1.2 element access: T& operator[](const key_type& x); T& operator[](key_type&& x); T& at(const key_type& x); const T& at(const key_type& x) const; ... }; }
unordered_map にもあります
と、似たような話題があった。短いから全文引用しちゃおう
SGI の STL ドキュメンテーションの map の項には,次のような脚注がある。
operator[]は map に新しい要素を追加する可能性があるため, const メンバー関数にすることができない。 operator[]の定義は非常にシンプルであることに注目せよ。 m[k] は (**1.second と等価である。厳密に言えば,このメンバー関数は不要である。これは便宜性のためだけに存在している。
ここは「どこがシンプルやねん!」と突っ込むところ。演算子オーバーロードの害悪説を唱える人や,同一機能の複数定義をタブー視する人に対して,逆説的に反論しているのか,あるいは単なるユーモアなのか……。 const 化の可能性を捨てている点は少し気になるけれど,この手の C++ 的シンタックスシュガーではよくあることと割り切るのが適当だと思う。
Randium Software - map::operator[]は必要無い?
*1:m.insert(value_type(k, data_type()))).first