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

Meh*_*dad 10 c++ pod memcpy c++11

确实知道is_pod一个类型的充分条件是memcpy可行的,但has_trivial_destructor 足够用于此目的?如果没有,为什么?

R. *_*des 22

不需要.要求是类型可以轻易复制(§3.9/ 2),它有一些更多的要求,比如缺少非平凡的复制构造函数(§9/ 6).

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

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

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

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

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

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

所以你应该使用is_trivially_copyable.


Die*_*ühl 9

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


Cha*_*via 5

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