目录
前言
因为要整理近期学习的c++特性,特地出一篇来介绍POD
类型和c++11引进的Trivial
和Standard-layout
聚合
聚合是以下类型之一:
- 数组类型
- 类类型(通常,struct或union)具有
没有用户声明的构造函数 | (直到 C++11) |
---|---|
没有用户提供的构造函数(允许显式默认或删除的构造函数) | (C++11 起) (C++17 前) |
没有用户提供的、继承的或显式(指explicit ,c++17特意新加)的构造函数(允许显式默认或删除的构造函数) |
(C++17 起) (C++20 前) |
没有用户声明或继承的构造函数(相当于=default 不行了) |
(C++20 起) |
- 没有
virtual
、private
或protected
(C++17 起)基类 - 没有虚拟成员函数
没有默认的成员初始化器 | (C++11 起) (C++14 前) |
---|
聚合初始化。它是列表初始化 (C++11 起)或直接初始化 (C++20 起)的一种形式
POD(Plain Old Data)
POD规范着对象的类型,主要是为了兼容C,C++可以直接使用C库函数操作POD数据类型,拥有POD特征的类或结构体通过直接字节拷贝或二进制拷贝后依然能保持数据结构不变,POD类型在C和C++间的操作总是安全的。
特征:
- 标量类型(算术类型(整型/浮点型)、指针、成员指针、枚举类型)
- 类类型(class、struct、union)
- 从c++11起
- 是平凡(
trivial
)类型(后续介绍) - 是标准布局(
standard-layout
)类型(后续介绍) - 所有非静态成员都是POD类型
- 是平凡(
- 从c++11起
特性:
- 完全与C兼容,但是仍然可以有成员函数;POD类型标准到甚至可以与其他语言兼容;
- 可以用
std::memcpy
拷贝(对于非POD类型,即使满足TriviallyCopyable
,用std::memcpy
拷贝的行为也是未定义的) - 有更长的生命周期,从资源获取到资源释放,而非POD类型的是从构造函数结束到析构函数结束;
- POD类型对象的前部没有填充字节,即对象指针与第一个成员的指针是相等的
来自cppreference:PODType
平凡类型(TrivialType)
要求
- 平凡可复制
- 如果类型是类类型或其数组,则该类具有一个或多个