根据我们谈论的重载,std::unordered_map::operator[]
相当于[unord.map.elem]
T& operator[](const key_type& k)
{
return try_emplace(k).first->second;
}
(采用右值引用的重载只是移动k
到try_emplace
并且在其他方面是相同的)
k
如果map 中的key 下存在元素,则try_emplace
返回该元素的迭代器和false
. 否则,try_emplace
在 key 下插入一个新元素k
,并返回一个迭代器和true
[unord.map.modifiers]:
template <class... Args>
pair<iterator, bool> try_emplace(const key_type& k, Args&&... args);
对我们来说有趣的是还没有元素的情况[unord.map.modifiers]/6:
否则插入一个由value_type
构造的类型的对象piecewise_construct, forward_as_tuple(k), forward_as_tuple(std::forward<Args>(args)...)
(采用右值引用的重载只是移动k
到forward_as_tuple
并且再次相同)
由于value_type
是pair<const Key, T>
[unord.map.overview]/2,这告诉我们新的地图元素将被构造为:
pair<const Key, T>(piecewise_construct, forward_as_tuple(k), forward_as_tuple(std::forward<Args>(args)...));
由于args
来自 时为空operator[]
,这归结为我们的新值被构造为pair
from 无参数[pairs.pair]/14的成员,这是使用类型值的直接初始化[class.base.init]/7作为初始化器,归结为值初始化[dcl.init]/17.4。an 的值初始化为零初始化[dcl.init]/8。an 的零初始化自然会将其初始化为 0 [dcl.init]/6。T
()
int
int
int
所以是的,你的代码保证返回 0…