C++20: Trivial type, Standard-layout, POD, Aggregate

FEATURE Trivial Standard-layout POD Aggregate
default constructor Y Y Y Y
default constructor (=default) Y Y Y N
custom constructor Y? Y Y? N
class member initializers N Y N Y
virtual functions N N N N
reference members Y N N Y
private members Y Y Y N
diff member access control Y N N N
base class Y Y Y Y
virtual inheritance N N N N
non-static memebers in diff class Y N N Y
recursive requirement Y Y Y N

Trivial types

也就是说:

  1. 具有平凡默认构造函数、平凡复制构造函数、平凡复制赋值运算符和平凡析构函数

    用户提供带参数的构造函数是没有问题的

  2. 没有虚函数或虚基类
  3. 没有具有相应的非平凡构造函数/运算符/析构函数的基类
  4. 没有具有相应的非平凡构造函数/运算符/析构函数的类类型的数据成员

Standard-layout types

也就是说:

  1. 可以有用户定义的特殊成员函数
  2. 没有虚函数或虚基类
  3. 所有非静态数据成员具有相同的访问控制
  4. 所有非静态数据成员都是标准布局
  5. 任何基类都是标准布局
  6. 第一个非静态数据成员类型不能跟基类相同
  7. 满足以下条件之一:

    继承链中只能有一个类有非静态数据成员

    • 最派生类中没有非静态数据成员,并且没有超过一个基类具有非静态数据成员
    • 没有包含非静态数据成员的基类

Plain Old Data

POD = Trivial + Standard-layout

Aggregate

聚合类型看作是其它类型的组合。

Reference