C++ 概念: StandardLayoutType

来自cppreference.com
< cpp‎ | concept
 
 
 

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

注意,标准没有定义拥有此名称的具名要求或概念。这是语言核心定义的类型。将它包含于此只是为了一致性。

目录

[编辑] 要求

  • 全部非静态数据成员必须拥有同一访问控制
  • 无虚函数或虚基类
  • 无引用类型的非静态数据成员
  • 所有非静态数据成员和基类自身是标准布局类型
  • 满足以下之一
  • 无带非静态数据成员的基类,或
  • 在最后导出类无非静态数据成员,且至多有一个基类拥有非静态数据成员
  • 无与首个非静态数据成员同类型的基类(见空基类优化
(C++14 前)
  • 无二个拥有相同类型的基类子对象
struct Q {};
struct S : Q { };
struct T : Q { };
struct U : S, T { };         // 非标准布局类
  • 在同一类中声明所有非静态数据成员(要么全在导出类,要么在某个基类)
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 作为首个成员的数组在在比较首元素类型和基类类型时不考虑 考虑数组元素

[编辑] 参阅

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