我可以memcpy()任何具有普通析构函数的类型吗?

时间:2012-08-16 00:31:48

标签: c++ c++11 memcpy pod

认识is_pod是类型为memcpy能力的充分条件,但是has_trivial_destructor 也是足够的目的?如果没有,为什么?

4 个答案:

答案 0 :(得分:22)

没有。要求是类型是平易可复制的(§3.9/ 2),其具有a few more requirements,就像缺少非平凡的复制构造函数(§9/ 6)。

  

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

     

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

     

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

     

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

     

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

     

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

所以你应该改用is_trivially_copyable

答案 1 :(得分:9)

对象具有普通的析构函数是不够的。它还需要进行简单的复制操作。例如,对象可以保持指向内部缓冲区的指针。没有必要销毁任何东西,但复制需要在复制到对象中设置指针,否则它们会指向源对象的缓冲区。

答案 2 :(得分:5)

虽然在实践中它通常很少见,但是可能存在一个类具有非平凡的复制构造函数以及一个简单的析构函数的情况。考虑一个带有静态成员变量的类,该变量只计算该类被复制的次数。如果您memcpy,则计数器将不准确。

答案 3 :(得分:0)

在我看来,一个带有普通指针的类符合has_trivial_destructor的条件,但你通常想要制作一个深层副本,而memcpy会创建一个浅副本。