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

Bel*_*loc 4 c++ initialization c++03

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

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

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

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

  • 否则,该对象是零初始化的.

有了这段代码

struct Int { int i; };

int main()
{
    Int a;
}
Run Code Online (Sandbox Code Playgroud)

该对象a是默认初始化的,但显然a.i不一定等于0.这与标准是否相矛盾,IntPOD也不是数组?

编辑 已更改为class,struct因此这Int是一个POD.

Bjö*_*lex 6

从2003年标准的8.5.9:

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

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

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

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

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

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

- 否则,不执行初始化.