类型分类
普通类型
普通类型(Trivial Type)指满足以下条件的类型:
- 有平凡的默认构造函数或用户声明的无参构造函数
- 有平凡的拷贝构造函数
- 有平凡的移动构造函数
- 有平凡的拷贝赋值运算符
- 有平凡的移动赋值运算符
- 没有虚函数、不包含虚基类
cpp
// 满足条件:使用合成默认构造、默认拷贝、默认移动
struct Trivial {
int a;
double b;
};
// 不满足条件:包含用户自定义构造函数 -> 非平凡
class NonTrivial {
int x;
public:
NonTrivial(int v) : x(v) {}
};标准布局类型
标准布局类型(Standard Layout Type)满足:
- 所有非静态成员具有相同的访问控制(全
public/ 全private/ 全protected) - 没有虚函数和虚基类
- 所有非静态成员本身是标准布局类型
- 收割非静态成员不是基类类型(避免与基类内存重叠)
cpp
// 标准布局
struct A {
int x;
int y;
};
// 非标准布局
struct B {
public:
int x;
private:
int y; // 访问控制不同 -> 非标准布局
};POD 类型
POD = Plain Old Data
POD = Trivial + Standard Layout
同时满足普通类型和标准布局类型:
cpp
struct POD {
int a;
double b;
char c;
};
// POD 可用 memset / memcpy 安全操作
POD p1, p2;
memcpy(&p2, &p1, sizeof(POD)); // 安全验证方法:
cpp
#include <type_traits>
static_assert(std::is_trivial_v<Trivial>); // 普通类型
static_assert(std::is_standard_layout_v<A>); // 标准布局
static_assert(std::is_pod_v<POD>); // POD文本类型
文本类型是可以在编译期求值的类型:
- 字面量类型:编译时常量
- 满足以下条件之一:
void类型- 标量类型(
int、float、指针等) - 引用类型
- 数组类型
- 有
constexpr构造函数 且全是constexpr成员
cpp
struct Literal {
int x;
constexpr Literal(int v) : x(v) {} // 常量构造函数
};
constexpr Literal lit(10); // 编译期常量