什么是C++中的POD类型?
非常非正式地:
POD是一种类型(包括类),其中C++编译器保证结构中没有“魔法”:例如指向虚函数表的隐藏指针,在将其转换为其他类型时应用于地址的偏移量(至少是目标的POD),构造函数或析构函数。 粗略地说,当它唯一包含内置类型和这些类型的组合时,类型是POD。其结果是“看起来像”C类型。
不太非正式地:
int
、char
、wchar_t
、bool
、float
、double
是POD,long/short
和它们的signed/unsigned
版本也是。- 指针(包括指向函数和成员的指针)是POD,
枚举
是POD- const或volatile POD是POD。
- 由POD组成的
class
、struct
或union
是POD,前提是所有非静态数据成员都是public
,它没有基类和没有构造函数,析构函数或虚拟方法。在此规则下,静态成员不会阻止某些物品成为POD。在C++11中,此规则已更改,允许某些私有成员: Can a class with all private members be a POD class? - 维基百科错误地说POD不能有指针成员。或者更准确地说,对于C++98措辞是正确的,但是TC1明确表示指向成员的指针是POD。
正式地(C++03标准):
3.9(10):“算术类型(3.9.1),枚举类型,指针类型和成员指针类型(3.9.2)及其cv限定的版本(3.9.3)共同称为标量类型。标量类型,POD结构类型,POD联合类型(第9条),这些类型的数组以及其cv限定的版本(3.9.3)被称为POD类型”
9(4): “一个POD-struct是一个聚合类,它没有非静态数据成员是非POD-struct、非POD-union(或这些类型的数组)或引用类型,并且没有用户定义的复制运算符和用户定义的析构函数。同样地,一个POD-union是一个聚合联合,它没有非静态数据成员是非POD-struct、非POD-union(或这些类型的数组)或引用类型,并且没有用户定义的复制运算符和用户定义的析构函数。
8.5.1(1): “一个聚合是一个没有用户声明构造函数(12.1),没有私有或保护非静态数据成员(11),没有基类(10)和没有虚函数(10.3)的数组或类(条款9)。”
POD代表“普通旧数据”——即一个类(无论是用关键字struct
还是关键字class
定义)没有构造函数、析构函数和虚成员函数。维基百科关于POD的文章更详细地定义它为:
C++中的一个普通旧数据结构就是一个包含仅由PODS组成的聚合类,它没有用户定义的析构函数,没有用户定义的复制赋值运算符,也没有指向成员类型的非静态成员。
在C++98/03的这个答案中可以找到更详细的内容。C++11改变了POD周围的规则,大大放宽了它们,因此需要在这里进行跟进回答。