【发布时间】:2013-05-08 16:21:32
【问题描述】:
这些何时会给出不同的答案,这种差异何时有用(如果有的话)?
【问题讨论】:
标签: c++ c++11 typetraits
这些何时会给出不同的答案,这种差异何时有用(如果有的话)?
【问题讨论】:
标签: c++ c++11 typetraits
前一个测试trivially copyable属性,简而言之就是类型是memcpy-safe。
一般可复制的类是这样的类:
——没有重要的复制构造函数(12.8),
——没有重要的移动构造函数(12.8),
——没有非平凡的复制赋值运算符(13.5.3、12.8),
——没有非平凡的移动赋值运算符(13.5.3、12.8),并且
——有一个简单的析构函数(12.4)。
普通类是具有普通默认构造函数 (12.1) 且可轻松复制的类。
[ 注意: 特别是,平凡可复制或平凡的类没有虚函数 或虚拟基类。—结束说明 ]
后者测试普通复制构造函数的存在,顺便说一句,这是普通可复制属性的要求。它基本上意味着该类型的复制构造函数执行按位复制。
类 X 的复制/移动构造函数是微不足道的,如果它不是用户提供的并且如果
——X 类没有虚函数 (10.3) 和虚基类 (10.1),并且
——选择复制/移动每个直接基类子对象的构造函数是微不足道的,并且
——对于 X 的每个类类型(或其数组)的非静态数据成员,构造函数 选择复制/移动该成员是微不足道的;
否则复制/移动构造函数是不平凡的。
为这些特征提供不同结果的类型很容易制造:
struct foo {
foo(foo const&) = default; // this is a trivial copy constructor
~foo(); // this is a non-trivial destructor
};
【讨论】: