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
是默认初始化的,但显然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() ;
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 如何使用默认参数等选择模板专业化
- 具有默认模板参数的多态类的模板推导失败
- 默认情况下初始化时 POD 是否给予特殊处理 (C++14)?
- 在不使用默认构造函数的情况下声明 POD 结构时,会实例化什么?
- 初始化新对象时C++默认构造函数和 POD 问题
- POD成员默认初始化无括号
- POD 类型是否可以具有显式声明的默认移动分配运算符
- 非 pod 类型的布局(因为具有默认构造函数)
- 默认的构造函数和POD
- 类 POD 成员默认初始化与零初始化与无初始化
- 默认构造函数、POD初始化和C++11中的隐式类型转换
- C++中POD类的快速默认排序
- POD与非POD类类型的默认初始化
- 迭代器默认构造函数和POD成员初始化
- 获取默认初始化(NOT value/零初始化)POD作为右值
- 从POD结构继承的类中默认构造函数的奇怪行为
- 是 POD 静态的默认析构函数
- 在POD中强制默认初始化构造函数
- c++中POD类型的默认值和值初始化