当我第一次访问std::unordered_map using operator []中的元素时,它会自动创建。什么(如果有的话)是关于它初始化的保证? (保证值被初始化,或者仅被构建)?
示例:
std::unordered_map<void *, size_t> size;
char *test = new char[10];
size[test] += 10;
在此序列结束时,尺寸[test]是否保证为10?
答案 0 :(得分:22)
在此序列结束时,尺寸[test]是否保证为10?
是。
在代码的最后一行,size[test]
将元素值初始化为T()
,或者在这种情况下size_t()
:
C ++ 11 23.4.4.3地图元素访问[map.access]
T& operator[](const key_type& x)
;1效果:如果地图中没有等效于x的键,请将value_type(x, T())插入地图。
关于T()
,确切的语言有点涉及,所以我会尝试引用相关的部分:
C ++ 11 8.5.16初始值设定项的语义如下。
- 如果初始值设定项为(),则对象将进行值初始化。
8.5.7 value-initialize T类型的对象意味着:
- 如果T是(可能是cv认证的)类类型......
- 如果T是(可能是cv认证的)非联合类类型......
- 如果T是数组类型,则每个元素都是值初始化的;
- 否则,该对象为零初始化。
8.5.5 零初始化 T类型的对象或引用意味着:
- 如果T是标量类型(3.9),将对象设置为值0(零),作为整数常量表达式,转换为T;
答案 1 :(得分:0)
有什么区别?类类型对象的值初始化需要默认构造,因此答案是“两者”。对于地图<K, V>
,新对象将使用V()
初始化。
所有标准容器都使用值或直接初始化初始化新元素(后者可能通过复制构造)。新标准容器元素不可能处于“未初始化”状态(即没有默认 - 初始化元素的机制)。