C++11 标准仍然要求 std::map 对内置类型进行零初始化(就像以前的标准一样),但原因与 Luke Halliwell 的回答中的原因有点不同。特别是,“默认初始化”内置数据类型并不意味着在 C++11 标准中进行零初始化,而是意味着“什么都不做”。实际发生的std::map::operator[]
是“值初始化”。
尽管如此,新标准的最终结果与卢克的答案相同。这些值将被零初始化。以下是标准的相关部分:
第 23.4.4.3 节“地图元素访问”说
T& 运算符[](const key_type& x);
效果:如果地图中没有与 x 等效的键,则插入value_type(x, T())
到地图中。
...
表达式T()
在第 8.5 节中描述
初始化器是一组空括号的对象,即 (),应进行值初始化。
X a();
这种“值初始化”在同一节中进行了描述
对 T 类型的对象进行值初始化意味着:
- 如果 T 是具有用户提供的构造函数 (12.1) 的(可能是 cv 限定的)类类型(第 9 条),则调用 T 的默认构造函数(如果 T 没有可访问的默认构造函数,则初始化格式错误) ;
- 如果 T 是没有用户提供的构造函数的(可能是 cv 限定的)非联合类类型,则该对象被零初始化,并且如果 T 的隐式声明的默认构造函数不平凡,则调用该构造函数。
- 如果 T 是一个数组类型,那么每个元素都是值初始化的;
- 否则,对象被零初始化。