什么是C++中的POD类型?

42 浏览
0 Comments

什么是C++中的POD类型?

我已经几次看到这个词“POD-type”。

它是什么意思?

admin 更改状态以发布 2023年5月23日
0
0 Comments

非常非正式地:

POD是一种类型(包括类),其中C++编译器保证结构中没有“魔法”:例如指向虚函数表的隐藏指针,在将其转换为其他类型时应用于地址的偏移量(至少是目标的POD),构造函数或析构函数。 粗略地说,当它唯一包含内置类型和这些类型的组合时,类型是POD。其结果是“看起来像”C类型。

不太非正式地:

  • intcharwchar_tboolfloatdouble是POD,long/short和它们的signed/unsigned版本也是。
  • 指针(包括指向函数和成员的指针)是POD,
  • 枚举是POD
  • const或volatile POD是POD。
  • 由POD组成的classstructunion是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)。”

0
0 Comments

POD代表“普通旧数据”——即一个类(无论是用关键字struct还是关键字class定义)没有构造函数、析构函数和虚成员函数。维基百科关于POD的文章更详细地定义它为:

C++中的一个普通旧数据结构就是一个包含仅由PODS组成的聚合类,它没有用户定义的析构函数,没有用户定义的复制赋值运算符,也没有指向成员类型的非静态成员。

C++98/03的这个答案中可以找到更详细的内容。C++11改变了POD周围的规则,大大放宽了它们,因此需要在这里进行跟进回答

0