POD与非POD类类型的默认初始化

时间:2011-11-24 11:26:47

标签: c++ initialization c++03

C ++标准说(8.5 / 5):

  

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

     
      
  • 如果T是非POD类类型(第9节),则调用T的默认构造函数(如果T具有T,则初始化不正确没有   可访问的默认构造函数)。

  •   
  • 如果struct Int { int i; }; int main() { Int a; } 是数组类型,则每个元素都是默认初始化的。

  •   
  • 否则,对象将被初始化为零。

  •   

使用此代码

a

对象a.i是默认初始化的,但显然Int不一定等于0。这与标准是否相矛盾,因为class是POD而不是数组?

修改已从struct更改为Int,以便{{1}}为POD。

3 个答案:

答案 0 :(得分:6)

从2003年标准的8.5.9开始:

  

如果没有为对象指定初始化程序,并且该对象是   (可能是cv限定的)非POD类类型(或其数组),.   对象应默认初始化;如果对象是   const-qualified类型,底层类类型应具有   用户声明的默认构造函数。 否则,如果没有初始化程序   为非静态对象,对象及其子对象指定,如果   任何,具有不确定的初始值);如果对象或任何   它的子对象属于const限定类型,程序格式不正确。

您显示的类是POD,因此突出显示的部分适用,您的对象根本不会被初始化(因此您引用的第8.5 / 5节根本不适用)。

编辑:根据您的评论,这里是当前标准最终工作草案第8.5 / 5节的引用(我没有真正的标准,但FDIS应该是非常的接近):

  

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

     

- 如果T是a(可能是   cv-qualified)类类型(第9节),T的默认构造函数是   调用(如果T无法访问,则初始化结果不正确   默认构造函数);

     

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

     

- 否则,不会执行初始化。

答案 1 :(得分:1)

您的变量未初始化。 使用

Int a = Int();

初始化你的POD或声明一个标准构造函数使其成为非POD; 但是出于性能原因,您也可以使用未初始化的POD,如:

Int a;
a.i = 5;

答案 2 :(得分:0)

不,对象a未默认初始化。如果你想默认初始化它,你必须说:

Int a = Int() ;