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

时间:2010-12-24 03:12:00

标签: c++ default-value stdmap

最近,我对std :: map operator []函数感到困惑。 在MSDN库中,它说:“如果找不到参数键值,那么它将与数据类型的默认值一起插入。” 我试图更准确地搜索这个问题的解释。例如这里: std::map default value 在这个页面中,Michael Anderson说“默认值是由默认构造函数(零参数构造函数)构造的”。

现在我的任务是:“内置类型的默认值是什么?”。编译器是否相关?或者c ++标准委员会是否有这个问题的标准?

我在visual studio 2008上对“int”类型进行了测试,发现“int”类型的构造值为0。

4 个答案:

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