最近,我对std :: map operator []函数感到困惑。 在MSDN库中,它说:“如果找不到参数键值,那么它将与数据类型的默认值一起插入。” 我试图更准确地搜索这个问题的解释。例如这里: std::map default value 在这个页面中,Michael Anderson说“默认值是由默认构造函数(零参数构造函数)构造的”。
现在我的任务是:“内置类型的默认值是什么?”。编译器是否相关?或者c ++标准委员会是否有这个问题的标准?
我在visual studio 2008上对“int”类型进行了测试,发现“int”类型的构造值为0。
答案 0 :(得分:26)
这是在标准中定义的,是的。在这种情况下,map正在执行“默认初始化”。如你所说,对于类类型,它调用一个无参数的构造函数。
对于内置类型,在'98标准中,请参见第8.5节“初始化器”:
默认初始化T类型的对象意味着:
- 如果T是非POD ......
- 如果T是数组类型......
- 否则,对象的存储是零初始化
以前,
对T类型的对象进行零初始化存储意味着:
- 如果T是标量类型,则存储设置为值0(零)转换为T
标量类型是:
特别是,您使用整数(初始化为零)看到的行为由标准定义,您可以依赖它。
答案 1 :(得分:18)
C ++ 11标准仍然要求std :: map对内置类型进行零初始化(与之前的标准一样),但其原因与Luke Halliwell的回答略有不同。特别是,对于'默认初始化',内置数据类型并不意味着在C ++ 11标准中进行零初始化,而是意味着“什么也不做”。 std::map::operator[]
中实际发生的是'值初始化'。
尽管如此,新标准的最终结果与卢克的答案相同。这些值将被零初始化。以下是该标准的相关部分:
第23.4.4.3节“地图元素访问”说
T&安培; operator [](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是数组类型,则每个元素都是值初始化的;
- 否则,该对象为零初始化。
答案 2 :(得分:8)
类类型对象的默认值是由类的默认构造函数设置的值。对于内置类型,默认值为0。
但请注意,未初始化的内置变量与初始化为默认值的内置变量之间存在差异。未初始化的内置函数可能会保存当时该变量的内存地址中的任何值。
int i; // i has an arbitrary undefined value
int x = int(); // x is 0
答案 3 :(得分:4)
|expression: | POD type T | non-POD type T
==================================================================================================
| new T | not initialized | default-initialized
| new T() | always default-initialized | always default-initialized
| new T(x) | always initialized via a constructor | always initialized via a constructor
据我所知,stl使用新的T()作为默认值,因此如果int为0,它将被默认初始化。