POD类型的定义
必须是平凡的和有标准布局的。
平凡的构造函数与析构函数是默认的,不起任何作用的。如果自定义了,那么需要声明为default
类型的。
使用std::is_trivial
进行判别。
标准布局必须是有以下几个属性:
- 所有的非静态成员有相同的访问权限
- 类或者体系结构继承时,必须有下面两种情况之一:
- 派生类中有非静态成员,且仅有一个包含静态成员的基类
- 基类有非静态成员,而派生类没有非静态成员
- 类中第一个非静态成员与基类不同
- 没有虚函数和虚基类
- 所有的非静态成员均符合标准布局类型,其基类也符合标准布局
使用std::is_standard_layout
进行判别
POD类型的应用
主要有3点优势:
- 字节赋值,可以使用
memset
和memcpy
进行初始化、拷贝等 - 提供对C内存布局的兼容
- 暴增静态初始化的安全有效。