std :: map内置类型的默认值

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(零)

标量类型是:

  • 算术类型(整数,浮点)
  • 枚举类型
  • 指针类型
  • 指向成员类型的指针

特别是,您使用整数(初始化为零)看到的行为由标准定义,您可以依赖它.

  • 我刚刚在C++ 11标准中对此进行了检查,它说的有些不同.它表示如果类型不是类或数组,则执行_no初始化_.所以我现在不确定标准容器中的默认值. (2认同)

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是数组类型,那么每个元素都是值初始化的;
  • 否则,该对象被零初始化.


wil*_*ell 8

类类型对象的默认值是由类的默认构造函数设置的值.对于内置类型,默认值为0.

但请注意,未初始化的内置变量与初始化为默认值的内置变量之间存在差异.未初始化的内置函数可能会保存当时该变量的内存地址中的任何值.

int i;          // i has an arbitrary undefined value
int x = int();  // x is 0
Run Code Online (Sandbox Code Playgroud)


j_k*_*bik 5

 |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,它将被默认初始化。