POD类型(Plain Old Data)代表该类型与C语言兼容,能以二进制的方式转换为C语言的类型
标准布局类型对于与用其他语言编写的代码进行通信非常有用
- 可以使用字节赋值,比如memset,memcpy操作
- 对C内存布局兼容。
- 保证了静态初始化的安全有效
一个类型如果是POD类型,则满足如下三个条件
-
是一个平凡类型
有平凡的构造函数
有平凡的拷贝构造函数
有平凡的移动构造函数
有平凡的拷贝赋值运算符
有平凡的移动赋值运算符
有平凡的析构函数
不包含虚函数
不包含虚基类
以下几种类型都不属于POD类型
class A {
A(){}
}; // 破坏了平凡构造函数
class B {
B(B&){}
}; // 破坏了平凡拷贝构造函数
class C {
C(C&&){}
}; // 破坏了平凡移动构造函数
class D {
D operator=(D&){}
}; // 破坏了平凡拷贝赋值运算符
class E {
E operator=(E&&){}
}; // 破坏了平凡移动赋值运算符
class F {
~F(){}
}; // 破坏了平凡析构函数
class G {
virtual void func();
} // 有虚函数
class H : G {
} // 有虚基类
-
有标准布局
所有非静态成员具有相同的访问权限
class A {
private:
int a;
public:
int b;
}; // 非静态成员变量访问权限不同
没有虚函数,没有虚基类
class D {
virtual void func();
}; // 虚函数
class E : D {
}; // 虚基类
没有非静态的引用类型
class A {
int& a;
} // 有非静态引用类型
没有两个相同类型的基类子对象(可能是间接的)
struct Q {};
struct S : Q { };
struct T : Q { };
struct U : S, T { }; // S T都继承自Q类型,因此U不符合标准布局
非静态数据成员和位域都在同一个类中(要么都在子类中,要么都在某一个基类中)
struct B { int i; }; // standard-layout class
struct C : B { }; // standard-layout class
struct D : C { }; // standard-layout class
struct E : D { char : 4; }; // not a standard-layout class
类中第一个非静态类型与基类不是同一个类型
class C1 {
};
class C : C1 {
C1 c1;
};
所有非静态成员和基类都是标准布局
-
所有非静态成员都是POD类型