C++0x map::at

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 にもあります



と、似たような話題があった。短いから全文引用しちゃおう

SGISTL ドキュメンテーションの map の項には,次のような脚注がある。

operator[]は map に新しい要素を追加する可能性があるため, const メンバー関数にすることができない。 operator[]の定義は非常にシンプルであることに注目せよ。 m[k] は (**1.second と等価である。厳密に言えば,このメンバー関数は不要である。これは便宜性のためだけに存在している。

ここは「どこがシンプルやねん!」と突っ込むところ。演算子オーバーロードの害悪説を唱える人や,同一機能の複数定義をタブー視する人に対して,逆説的に反論しているのか,あるいは単なるユーモアなのか……。 const 化の可能性を捨てている点は少し気になるけれど,この手の C++ 的シンタックスシュガーではよくあることと割り切るのが適当だと思う。

Randium Software - map::operator[]は必要無い?


C++0x言語拡張まとめ


*1:m.insert(value_type(k, data_type()))).first