>>473
悪いというよりは、C++の文法的な問題が絡んでいるのでは。
つまり、map[] = a という代入は operator [] ⇒ operator = という2ステップで処理されるので、
最初の operator [] は Value& を返さざるを得ない。
よって、operator [] で存在しないキーが指定された場合も、
参照だけでなく代入される恐れがあるので、どこかに実体を保持しておく必要がある。
だから、勝手に新しいValueが挿入される。

C# インデクサや、VC++ の __declspec(property) 方言のような、
map[key] = value ⇒ map.insert(key, value) 的な書き換えをしてくれたら、
参照と代入が明確に分離するので、const [] も可能だっただろう。

実は、C++だけでも、プロキシオブジェクトを返すようにすれば
const [] に対応することもできたはずなんだが……なぜそうならなかったのかは知らない。