我确实意识到is_pod
这是一个类型能够的充分条件memcpy
,但has_trivial_destructor
也足以达到这个目的吗?如果不是,为什么?
问问题
1369 次
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 回答