C++ 具名要求:可平凡复制 (TriviallyCopyable)

来自cppreference.com
< cpp‎ | named req
 
 
C++ 具名要求
基础
类型属性
TriviallyCopyable
(C++11)
库所属
容器
容器元素
迭代器
流 I/O
随机数
并发
(C++11)
(C++11)
其他
 

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

要求

下列类型统称为可平凡复制类型

  • 标量类型
  • 可平凡复制类类型,即满足下列条件的类类型:
    • 至少一个复制构造函数、移动构造函数、复制赋值运算符或移动赋值运算符是合格的
    • 每个合格的复制构造函数(若存在)均为平凡
    • 每个合格的移动构造函数(若存在)均为平凡
    • 每个合格的复制赋值运算符(若存在)均为平凡
    • 每个合格的移动赋值运算符(若存在)均为平凡
    • 拥有一个平凡而未弃置的析构函数
  • 可平凡复制 (TriviallyCopyable) 对象的数组

这意味着可平凡复制类没有虚函数虚基类

注解

一个复制构造函数、移动构造函数、复制赋值运算符或移动赋值运算符是合格的当且仅当它不是弃置的。

(C++20 前)

一般来说,对于任何可平凡复制类型 TT 对象 obj1 ,能复制 obj1 的底层字节到 charunsigned charstd::byte (C++17 起) 的数组中,或到 T 的另一不同对象 obj2 中。 obj1obj2 均不可为潜在重叠的子对象。

若复制 obj1 的底层字节到这种数组中,然后复制结果内容回 obj1 中,则 obj1 将保有其原值。若复制 obj1 的底层字节到 obj2 中,则 obj2 将保有 obj1 的值。

底层字节能由 std::memcpystd::memmove 复制,只要不访问存活的 volatile 对象。

缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

DR 应用于 出版时的行为 正确行为
CWG 1734 C++11 拥有弃置的非平凡赋值的 C++03 POD 不是平凡的 允许弃置的构造函数/运算符
CWG 2094 C++11 volatile 标量类型非可平凡复制( CWG 1746 ) 使之为可平凡复制

参阅

检查类型是否可平凡复制
(类模板)