我可以将memcpy用于那些std :: is_trivially_move_ *的东西吗?

时间:2018-04-08 03:16:17

标签: c++ c++11 c++14 c++17

is_trivially_copy_*is_trivially_move_*之间有什么区别?我可以使用memcpy来移动构造/赋值is_trivially_move_*类型吗?

1 个答案:

答案 0 :(得分:6)

它们之间的区别正是标准所说的:特定的操作是微不足道的。一个类可以有一个简单的复制构造函数和一个非平凡的移动构造函数,反之亦然。

但是,这些特征不足以替换为memcpy。标准允许您对TriviallyCopyable的对象使用memcpy。不仅仅是简单的复制可构造,而是完全可以复制TriviallyCopyable。所以你想要的特征是is_trivially_copyable

从技术上讲,您还应该检查该类型是否是可复制的/可分配的,具体取决于您是否memcpy生活对象。 TriviallyCopyable类型可以具有已删除的复制构造函数或赋值运算符,在这种情况下,该类的编写者期望不能复制该表单。 TriviallyCopyable类型更常见的情况是删除的副本赋值运算符(可能由于拥有const成员),在这种情况下,您不应memcpy到活动对象。