C++ 具名要求:标准布局类型 (StandardLayoutType)
来自cppreference.com
指定一个类型为标准布局类型。标准布局类型适用于与其他语言编写的代码交流。
注意:标准中并没有定义具有这个名字的具名要求。这是核心语言所定义的一种类型类别。将它作为具名要求包含于此只是为了保持一致性。
要求
- 所有非静态数据成员必须具有相同的访问控制
- 没有虚函数或虚基类
- 没有引用类型的非静态数据成员
- 所有非静态数据成员和基类自身也是标准布局类型
- 不存在两个相同类型的(可能间接的)基类子对象
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; }; // 非标准布局类
- 不存在与如下各项具有相同类型的基类子对象
- 对于非联合类型,为其首个非静态数据成员(见空基类优化),递归地,若该数据成员具有非联合类类型,则为其首个数据成员,或者若该数据成员为联合体类型,则为其所有非静态数据成员,或者若该数据成员为数组类型,则为其元素类型,依此递归。
- 对于联合体类型,为其任何非静态数据成员,递归地,若该数据成员具有非联合类类型,则为其首个数据成员,或者若该数据成员为联合体类型,则为其所有非静态数据成员,或者若该数据成员为数组类型,则为其元素类型,依此递归。
- 对于数组类型,为数组元素的类型,递归地,若该数据成员拥有非联合类类型,则为其首个数据成员,或者若该数据成员为联合体类型,则为其所有非静态数据成员,或者若该数据成员为数组类型,则为其元素类型,依此递归。
性质
见标准布局。
缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
DR | 应用于 | 出版时的行为 | 正确行为 |
---|---|---|---|
CWG 1672 | C++11 | 首个非静态数据成员的规则忽略了空基类的存在 | 首个非静态数据成员的规则被设为递归 |
CWG 1813 | C++11 | 带有定义于非直接基类中的成员的类在技术上不是标准布局 | 所有成员声明必须在同一类中 |
CWG 2120 | C++11 | 作为首个成员的数组在在比较首元素类型和基类类型时不考虑 | 考虑数组元素 |
参阅
(C++11) |
检查是否是一个标准布局类型 (类模板) |