WKP*_*lus 27 c++ stdmap default-value
最近,我被std :: map operator []函数搞糊涂了.在MSDN库中,它说:"如果找不到参数键值,那么它将与数据类型的默认值一起插入." 我试图更准确地搜索这个问题的解释.例如: std :: map default value 在这个页面中,Michael Anderson说"默认值是由默认构造函数(零参数构造函数)构造的".
现在我的任务是:"内置类型的默认值是什么?".编译器是否相关?或者c ++标准委员会是否有这个问题的标准?
我在visual studio 2008上对"int"类型进行了测试,发现"int"类型的构造值为0.
Luk*_*ell 26
这是在标准中定义的,是的.在这种情况下,map正在执行"默认初始化".正如你所说,对于类类型,它调用一个无参数的构造函数.
对于内置类型,在'98标准中,请参见第8.5节"初始化器":
默认初始化T类型的对象意味着:
- 如果T是非POD ......
- 如果T是一个数组类型......
- 否则,对象的存储被零初始化
以前,
为类型为T的对象零初始化存储意味着:
- 如果T是标量类型,则将存储设置为转换为T的值0(零)
标量类型是:
特别是,您使用整数(初始化为零)看到的行为由标准定义,您可以依赖它.
kar*_*doc 18
C++ 11标准仍然要求std :: map对内置类型进行零初始化(与之前的标准一样),但其原因与Luke Halliwell的回答略有不同.特别是,"默认初始化"内置数据类型并不意味着在C++ 11标准中进行零初始化,而是意味着"什么都不做".实际发生的std::map::operator[]是'值初始化'.
然而,新标准的最终结果与Luke的答案相同.这些值将被零初始化.以下是该标准的相关部分:
第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是数组类型,那么每个元素都是值初始化的;
- 否则,该对象被零初始化.
类类型对象的默认值是由类的默认构造函数设置的值.对于内置类型,默认值为0.
但请注意,未初始化的内置变量与初始化为默认值的内置变量之间存在差异.未初始化的内置函数可能会保存当时该变量的内存地址中的任何值.
int i; // i has an arbitrary undefined value
int x = int(); // x is 0
Run Code Online (Sandbox Code Playgroud)
|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
Run Code Online (Sandbox Code Playgroud)
据我所知,stl使用新的T()作为默认值,因此,如果int为0,它将被默认初始化。
| 归档时间: |
|
| 查看次数: |
15643 次 |
| 最近记录: |