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

Default initialization of POD vs. non-POD class types

本文关键字:POD 默认 初始化 类型 与非      更新时间:2023-10-16

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

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

  • 如果T是非POD类类型(子句9(,则调用T的默认构造函数(如果T没有可访问的默认构造函数(。

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

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

使用此代码

struct Int { int i; };
int main()
{
    Int a;
}

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

编辑class更改为struct,使Int成为POD。

2003标准8.5.9:

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

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

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

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

--如果T是(可能cv限定(类类型(第9条(,T的默认构造函数为调用(并且如果T不可访问,则初始化格式不正确默认构造函数(;

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

--否则,不执行初始化

您的变量未初始化。使用

Int a = Int();

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

Int a;
a.i = 5;

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

Int a = Int() ;