繁体   English   中英

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

[英]Default initialization of POD vs. non-POD class types

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

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

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

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

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

有了这段代码

struct Int { int i; };

int main()
{
    Int a;
}

对象a是默认初始化的,但显然ai不一定等于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() ;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM