mapのoperator[]

cppreference.com の map::operator[] の説明を読むと、こんなことが書かれています。

1) Essentially performs (insert(std::make_pair(key, T())).first)->second.
2) Essentially performs (insert(std::make_pair(std::move(key), T())).first)->second.

std::map::operator[] - cppreference.com

operator[] は insert(make_pair(key, T())).first->second と同じだ的なことを言ってるのですが、これ、違いますよね?
この場合だと既に key の要素が存在しているとき、T() のコンストラクタは無駄になるので、こっちの方が効率が悪くなるし、コンストラクタに副作用なんかがある場合は明らかに異なります。


他のところではどう説明しているのか調べてみると…。

m[k] is equivalent to (**1.second.

http://www.sgi.com/tech/stl/Map.html#3

A call to this function is equivalent to:
(**2.second

map::operator[] - C++ Reference

どれも同じ。

map_type m;
m[key] += value;

と等価な処理をするなら、

map_type::iterator it = m.lower_bound(key);
if (it == m.end() || m.key_comp()(key, it->first))
  m.insert(it, std::make_pair(key, map_type::mapped_type()))->second += value;
else
  it->second += value;

と書かないといけない気がします。

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

*2:this->insert(make_pair(x,T()))).first