C ++ 03中default-initialize和value-initialize之间的区别?

时间:2011-08-16 20:48:31

标签: c++ standards default-value default-constructor

我一直认为创建一个新对象总是会调用一个对象的默认构造函数,而构造函数是显式的还是由编译器自动生成的没有区别。根据{{​​3}}对不同的问题,这在C ++ 98和C ++ 03之间以微妙的方式发生了变化,现在就像这样:

struct B { ~B(); int m; }; // non-POD, compiler generated default ctor 
new B;   // default-initializes (leaves B::m uninitialized)
new B(); // value-initializes B which zero-initializes all fields since its default ctor is compiler generated as opposed to user-defined.

任何人都可以告诉我:

  1. 为什么标准发生了变化,即这给了什么优势,或者现在可能有什么优势;
  2. 术语“default-initialize”和“value-initialize”代表什么?
  3. 标准的相关部分是什么?

1 个答案:

答案 0 :(得分:2)

我不知道更改的基本原理(或之前的标准是怎样),但基于它是怎样的,基本上 default-initialization 要么调用用户定义的构造函数,要么什么也不做(这里有很多动手:这是递归地应用于每个子对象,这意味着将初始化具有默认构造函数的子对象,没有用户定义的构造函数的子对象将保持未初始化。

这属于仅支付您想要的语言语言的哲学,并且与所有C兼容的类型中的C兼容。另一方面,您可以请求值初始化,这相当于为初始化为0转换的对象调用默认构造函数到其余子对象的适当类型。

这在§8.5初始化程序中有所描述,导航并非易事。 zero-initialize default-initialize value-initialize 的定义是第5段:

  

零初始化T类型的对象意味着:

     

- 如果T是标量类型(3.9),则将对象设置为0(零)转换为T的值;

     

- 如果T是非联合类类型,则每个非静态数据成员和每个基类子对象都是零初始化;

     

- 如果T是联合类型,则对象的第一个命名数据成员89)是零初始化的;

     

- 如果T是数组类型,则每个元素都是零初始化的;

     

- 如果T是引用类型,则不执行初始化。

     

默认初始化T类型的对象意味着:

     

- 如果T是非POD类类型(第9节),则调用T的默认构造函数(如果T没有可访问的默认构造函数,则初始化是错误的);

     

- 如果T是数组类型,则每个元素都是默认初始化的;

     

- 否则,该对象为零初始化。

     

对T类型的对象进行值初始化意味着:

     

- 如果T是具有用户声明的构造函数(12.1)的类类型(第9节),则调用T的默认构造函数(如果T没有可访问的默认构造函数,则初始化是错误的); < / p>      

- 如果T是没有用户声明的构造函数的非联合类类型,则T的每个非静态数据成员和基类组件都是值初始化的;

     

- 如果T是数组类型,则每个元素都是值初始化的;

     

- 否则,该对象为零初始化

     

调用引用类型实体的默认初始化或值初始化的程序。如果T是cv限定类型,则cv非限定版本的T用于零初始化,默认初始化和值初始化的这些定义。