的std ::地图::操作符[]

时间:2016-10-18 01:24:55

标签: c++ dictionary initialization stdmap

我正在做一个简单的地图程序,但最终得到了这个问题。 c ++ doc说:

访问元素 如果k匹配容器中元素的键,则该函数返回对其映射值的引用。 如果k与容器中任何元素的键不匹配,则该函数将使用该键插入一个新元素,并返回对其映射值的引用。请注意,即使没有为元素指定映射值(使用其默认构造函数构造元素),这也总是会将容器大小增加1。

我真正得到的部分是它所说的"该元素是使用其默认构造函数"构造的。

我试了一下这个

std::map<string, int> m;
m["toast"];

我只是想看看&#34; toast&#34;的映射元素会有什么价值?是。它最终归零,但是,为什么呢?原始类型是否具有默认构造函数?或者发生了什么?

2 个答案:

答案 0 :(得分:4)

“使用其默认构造函数”的陈述令人困惑。更确切地说,对于std::map::operator[],如果密钥不存在,则插入的值将为value-initialized

  

当使用默认分配器时,这会导致密钥是从密钥构造的,而映射的值是value-initialized

对于T,这意味着zero-initialization

  

4)否则,该对象被零初始化。

答案 1 :(得分:1)

template: listing:41:46: executing "listing" at <.Host>: can't evaluate field Host in type browse.FileInfo 的地图值值初始化operator[]表示零初始化。

根据标准(第23.4.4.3节)的定义:

  

效果:如果地图中没有等效于x的键,请将int插入地图。

value_type(x, T())被解释为(§8.5/ 10):

  

一个对象,其初始化程序是一组空的括号,即T(),应进行值初始化   

表示(§8.5/ 8):

  

()类型的对象进行值初始化意味着:

     

[...]

     

- 否则,该对象为零初始化。

零初始化定义为(§8.5/ 6):

  

T类型的对象或引用进行零初始化意味着:

     

- 如果T是标量类型,则将对象设置为值0(零),   作为整数常量表达式,转换为T

     

[...]

取自n4140的所有引语