Skip to content

类型分类 ​

普通类型 ​

普通类型(Trivial Type)指满足以下条件的类型:

  1. 有平凡的默认构造函数或用户声明的无参构造函数
  2. 有平凡的拷贝构造函数
  3. 有平凡的移动构造函数
  4. 有平凡的拷贝赋值运算符
  5. 有平凡的移动赋值运算符
  6. 没有虚函数、不包含虚基类
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);  // 编译期常量