from Visual Studio 2012 library
mapped_type& operator[](key_type&& _Keyval)
{ // find element matching _Keyval or insert with default mapped
iterator _Where = this->lower_bound(_Keyval);
if (_Where == this->end()
|| this->_Getcomp()(_Keyval, this->_Key(_Where._Mynode())))
_Where = this->insert(_Where,
pair<key_type, mapped_type>(
_STD move(_Keyval),
mapped_type())); // <---- call to default constructor
return (_Where->second);
}
as you can see it require mapped_type
to be default construable to compile doesn't means it need to construct the object every time you call operator[]