[英]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.