根据cppreference.com,对于不存在的值,std::map::operator[]
进行零初始化。
但是,同一站点没有引用std::map::operator[]
的零初始化,但是它确实有一个依赖于此的示例。
当然,这只是参考站点,而不是标准站点。那么,下面的代码是否正确?
std::unordered_map::operator[]
您链接的网站上说:
使用默认分配器时,这将导致密钥被复制由键构造,并且映射的值被初始化。
所以std::unordered_map::operator[]
是#include <unordered_map>
int main() {
std::unordered_map<int, int> map;
return map[42]; // is this guaranteed to return 0?
}
:
值初始化的效果是:
[...]
4)否则,该对象为零初始化
这就是为什么结果是int
。
根据我们在说什么过载,value-initialized等于0
std::unordered_map::operator[]
((带有右值引用的重载只是将[unord.map.elem]移动到T& operator[](const key_type& k)
{
return try_emplace(k).first->second;
}
,否则是相同的)]
k
如果映射中键try_emplace
下存在某个元素,则template <class... Args>
pair<iterator, bool> try_emplace(const key_type& k, Args&&... args);
的返回值仅表示该现有元素。如果没有键k
的条目,则try_emplace
:
否则插入由
k
构造的[unord.map.modifiers]类型的对象
(带有右值引用的重载只是将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>
为空,所以新值将被构造为pair<const Key, T>(piecewise_construct, forward_as_tuple(k), forward_as_tuple(std::forward<Args>(args)...));
args
这是直接初始化 [pairs.pair]/14,类型为T()
的值,使用[dcl.init]/16作为初始化程序,最终归结为值初始化T
。 ()
的值初始化为零初始化[dcl.init]/17.4。
所以,可以保证您的代码返回0…