C++ 具名要求:标准布局类型 (StandardLayoutType)

< cpp‎ | named req
 
 
 

指定一个类型为标准布局类型。标准布局类型适用于与其他语言编写的代码交流。

注意:标准中并没有定义具有这个名字的具名要求。这是核心语言所定义的一种类型类别。将它作为具名要求包含于此只是为了保持一致性。

要求

  • 所有非静态数据成员必须具有相同的访问控制
  • 没有虚函数或虚基类
  • 没有引用类型的非静态数据成员
  • 所有非静态数据成员和基类自身也是标准布局类型
  • 满足以下之一
  • 没有带有非静态数据成员的基类,或
  • 最终派生类中没有非静态数据成员,且至多有一个基类拥有非静态数据成员
  • 没有与首个非静态数据成员类型相同的基类(见空基类优化
(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 作为首个成员的数组在在比较首元素类型和基类类型时不考虑 考虑数组元素

参阅

检查是否是一个标准布局类型
(类模板)