10

确实意识到is_pod这是一个类型能够的充分条件memcpy,但has_trivial_destructor 足以达到这个目的吗?如果不是,为什么?

4

4 回答 4

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改用。

于 2012-08-16T00:38:59.733 回答
9

一个对象有一个平凡的析构函数是不够的。它还需要进行简单的复制操作。例如,该对象可以维护指向内部缓冲区的指针。不需要销毁任何东西,但复制需要在复制的对象中设置指针,因为否则它们将指向源对象的缓冲区。

于 2012-08-16T00:39:02.277 回答
5

尽管在实践中通常很少见,但可能存在类具有非平凡复制构造函数以及平凡析构函数的情况。考虑一个具有静态成员变量的类,该变量仅计算该类被复制了多少次。如果你memcpy这样做,计数器将不准确。

于 2012-08-16T00:38:50.813 回答
0

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

于 2012-08-16T00:38:53.633 回答