我正在做一个简单的地图程序,但最终得到了这个问题。 c ++ doc说:
访问元素 如果k匹配容器中元素的键,则该函数返回对其映射值的引用。 如果k与容器中任何元素的键不匹配,则该函数将使用该键插入一个新元素,并返回对其映射值的引用。请注意,即使没有为元素指定映射值(使用其默认构造函数构造元素),这也总是会将容器大小增加1。
我真正得到的部分是它所说的"该元素是使用其默认构造函数"构造的。
我试了一下这个
std::map<string, int> m;
m["toast"];
我只是想看看&#34; toast&#34;的映射元素会有什么价值?是。它最终归零,但是,为什么呢?原始类型是否具有默认构造函数?或者发生了什么?
答案 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的所有引语