Plain Old Data https://zh.cppreference.com/w/cpp/named_req/PODType
简言之,针对POD对象,其二进制内容是可以随便复制的,在任何地方,只要其二进制内容在,就能还原出正确无误的POD对象。对于任何POD对象,都可以使用memset()函数或者其他类似的内存初始化函数。
这表示该类型与用于 C 程序语言的类型兼容,即能直接以其二进制形式与 C 库交互。
注意:标准中并没有定义具有这个名字的具名要求。这是核心语言所定义的一种类型类别。将它作为具名要求包含于此只是为了保持一致性。
此类型要求在 C++ 标准中已弃用。其所有使用都已被替换成更为斟酌过的类型要求,例如平凡类型 (TrivialType) 。(C++20 起)
要求
以下之一:
- 标量类型;
- 满足下列要求的类类型(class 或 struct 或 union):
|
(C++11 前) |
(C++11 起) |
- 这种类型的数组
----------------------------------------------------------------------------------------
什么是 平凡类型
要求
- 可平凡复制 (TriviallyCopyable)
- 拥有一个或多个默认构造函数,全部均为平凡或弃置的,且至少有一个未弃置。
什么是 可平凡复制
要求
- 每个复制构造函数均为平凡或弃置的
- 每个移动构造函数均为平凡或弃置的
- 每个复制赋值运算符均为平凡或弃置的
- 每个移动赋值运算符均为平凡或弃置的
- 至少一个复制构造函数、移动构造函数、复制赋值运算符或移动赋值运算符未弃置
- 平凡而未弃置的析构函数
标量类型和可平凡复制 (TriviallyCopyable) 对象的数组也是可平凡复制 (TriviallyCopyable) 的。
什么是 标准布局类型(StandardLayoutType)
指定一个类型为标准布局类型。标准布局类型适用于与其他语言编写的代码交流
要求
- 所有非静态数据成员必须具有相同的访问控制
- 没有虚函数或虚基类
- 没有引用类型的非静态数据成员
- 所有非静态数据成员和基类自身也是标准布局类型
|
(C++14 前) |
struct Q {};
struct S : Q { };
struct T : Q { };
struct U : S, T { }; // 并非标准布局类:有两个 Q 类型的基类子对象
struct B { int i; }; // 标准布局类
struct C : B { }; // 标准布局类
struct D : C { }; // 标准布局类
struct E : D { char : 4; }; // 非标准布局类
|