取决于我们在说的过载,std::unordered_map::operator[]
等效于[unord.map.elem]
T& operator[](const key_type& k)
{
return try_emplace(k).first->second;
}
(带有右值引用的重载只是k
移入try_emplace
,否则是相同的)
如果k
映射中键下存在元素,则将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,所以这告诉我们新的map元素将被构造为:
pair<const Key, T>(piecewise_construct, forward_as_tuple(k), forward_as_tuple(std::forward<Args>(args)...));
由于args
来自时为空operator[]
,因此可以归结为我们的新值,它是pair
从不带参数[pairs.pair] / 14的成员构造而成的,该参数是使用以下类型的值的直接初始化[class.base.init] / 7作为初始化器,可以归结为值初始化[dcl.init] /17.4。的值初始化为零初始化[dcl.init] / 8。自然零初始化将其初始化为0 [dcl.init] / 6。T
()
int
int
int
因此,可以,您的代码保证返回0…