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