is_trivially_copyable和is_trivially_copy_constructible有什么区别?

时间:2013-05-14 11:43:46

标签: c++ c++11 typetraits

这些什么时候会给出不同的答案,这种差异什么时候会有用呢?

1 个答案:

答案 0 :(得分:17)

以前对平易可复制的属性的测试,用少数几个词来表示类型为memcpy - 安全。

  

一个简单的可复制类是一个类:

     

- 没有非平凡的拷贝构造函数(12.8),

     

- 没有非平凡的移动构造函数(12.8),

     

- 没有非平凡的复制赋值运算符(13.5.3,12.8),

     

- 没有非平凡的移动赋值运算符(13.5.3,12.8)和

     

- 有一个简单的析构函数(12.4)。

     

一个普通的类是一个具有普通默认构造函数(12.1)并且可以轻易复制的类。

     

[注意:特别是,一个简单的可复制或普通的类没有虚函数   或虚拟基类。 -end note ]

后者测试是否存在普通复制构造函数,这是平易可复制的属性的要求。它基本上意味着该类型的复制构造函数执行按位复制。

  

如果不是用户提供的,并且如果

,则类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
};