std :: unordered_map初始化

时间:2012-01-20 14:53:35

标签: c++ std unordered-map

当我第一次访问std::unordered_map using operator []中的元素时,它会自动创建。什么(如果有的话)是关于它初始化的保证? (保证值被初始化,或者仅被构建)?

示例:

std::unordered_map<void *, size_t> size;
char *test = new char[10];
size[test] += 10;

在此序列结束时,尺寸[test]是否保证为10?

2 个答案:

答案 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()初始化。

所有标准容器都使用值或直接初始化初始化新元素(后者可能通过复制构造)。新标准容器元素不可能处于“未初始化”状态(即没有默认 - 初始化元素的机制)。