std :: unordered_map运算符[]对不存在的键进行零初始化吗?

问题描述 投票:7回答:2

根据cppreference.com,对于不存在的值,std::map::operator[]进行零初始化。

但是,同一站点没有引用std::map::operator[]的零初始化,但是它确实有一个依赖于此的示例。

当然,这只是参考站点,而不是标准站点。那么,下面的代码是否正确?

std::unordered_map::operator[]
c++ unordered-map zero-initialization
2个回答
10
投票

您链接的网站上说:

使用默认分配器时,这将导致密钥被复制由键构造,并且映射的值被初始化。

所以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


1
投票

根据我们在说什么过载,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…

© www.soinside.com 2019 - 2024. All rights reserved.