C++ 具名要求-布局

此页面中列出的具名要求,是 C++ 标准的规范性文本中使用的具名要求,用于定义标准库的期待。

某些具名要求在 C++20 中正在以概念语言特性进行形式化。在那之前,确保以满足这些要求的模板实参实例化标准库模板是程序员的重担。若不这么做,则可能导致非常复杂的编译器诊断。

布局

注意,标准并未定义这个子类别中指定的各名字的具名要求。
它们是由核心语言定义的类型分类。将它们作为具名要求于此处包含只是为了一致性。

拥有平凡的复制、赋值及析构函数的类

C++ 具名要求: TriviallyCopyable

要求

  • 每个复制构造函数均为平凡或弃置的
  • 每个移动构造函数均为平凡或弃置的
  • 每个复制赋值运算符均为平凡或弃置的
  • 每个移动赋值运算符均为平凡或弃置的
  • 至少一个复制构造函数、移动构造函数、复制赋值运算符或移动赋值运算符未弃置
  • 平凡而未弃置的析构函数

这意味着该类没有虚函数或虚基类。

标量类型和可平凡复制 (TriviallyCopyable) 对象的数组也是可平凡复制 (TriviallyCopyable) 的。

拥有平凡的构造函数、赋值及析构函数的类

C++ 具名要求: TrivialType

指定类型为平凡类型。

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

要求

  • 可平凡复制 (TriviallyCopyable)
  • 拥有一个或多个默认构造函数,全部均为平凡或弃置的,且至少有一个未弃置。

非虚类,仅包含其他标准布局 (standard layout) 成员,且其全部具有相同的访问控制

C++ 具名要求: StandardLayoutType

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

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

要求

  • 所有非静态数据成员必须具有相同的访问控制
  • 没有虚函数或虚基类
  • 没有引用类型的非静态数据成员
  • 所有非静态数据成员和基类自身也是标准布局类型
  • 满足以下之一
  • 没有带有非静态数据成员的基类,或
  • 最终派生类中没有非静态数据成员,且至多有一个基类拥有非静态数据成员
  • 没有与首个非静态数据成员类型相同的基类(见空基类优化)
(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; };  // 非标准布局类
  • 不存在与如下各项具有相同类型的基类子对象
  • 对于非联合类型,为其首个非静态数据成员(见空基类优化),递归地,若该数据成员具有非联合类类型,则为其首个数据成员,或者若该数据成员为联合体类型,则为其所有非静态数据成员,或者若该数据成员为数组类型,则为其元素类型,依此递归。
  • 对于联合体类型,为其任何非静态数据成员,递归地,若该数据成员具有非联合类类型,则为其首个数据成员,或者若该数据成员为联合体类型,则为其所有非静态数据成员,或者若该数据成员为数组类型,则为其元素类型,依此递归。
  • 对于数组类型,为数组元素的类型,递归地,若该数据成员拥有非联合类类型,则为其首个数据成员,或者若该数据成员为联合体类型,则为其所有非静态数据成员,或者若该数据成员为数组类型,则为其元素类型,依此递归。

性质

见标准布局。


POD(简旧数据)结构体,与 C 的 struct 兼容

C++ 具名要求: PODType

指定类型为 POD(Plain Old Data,简旧数据)类型。这表示该类型与用于 C 程序语言的类型兼容,即能直接以其二进制形式与 C 库交互。

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

此类型要求在 C++ 标准中已弃用。其所有使用都已被替换成更为斟酌过的类型要求,例如平凡类型 (TrivialType) 。

要求

以下之一:

  • 标量类型;
  • 满足下列要求的类类型(class 或 struct 或 union):
  • 聚合类型;
  • 没有非 POD 的非静态成员;
  • 没有引用类型的成员;
  • 没有用户定义的复制构造函数;
  • 没有用户定义的析构函数
(C++11 前)
  • 为平凡类型;
  • 为标准布局类型;
  • 没有非 POD 的非静态成员;
(C++11 起)
  • 这种类型的数组。

猜你喜欢

转载自blog.csdn.net/qq_40788199/article/details/135328814