c++ - 我可以只对那些 std::is_trivially_move_* 东西使用 memcpy 吗?

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

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

最佳答案

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

但是,这些特征不足以memcpy 替代。标准 允许您对TriviallyCopyable 的对象使用memcpy .不仅可以平凡地复制构造,而且可以完全平凡地复制。所以你想要的特征是 is_trivially_copyable

从技术上讲,您还应该检查类型是否可复制构造/可分配,具体取决于您是否正在memcpy事件对象。一个 TriviallyCopyable 类型可以有一个删除的复制构造函数或赋值运算符,在这种情况下,该类的作者希望不会发生这种形式的复制。 TriviallyCopyable 类型更常见的情况是删除复制赋值运算符(可能是因为有一个 const 成员),在这种情况下你不应该 memcpy 到事件对象。

关于c++ - 我可以只对那些 std::is_trivially_move_* 东西使用 memcpy 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49714055/

相关文章:

c++ - 区分具有相同类型和比率的 std::chrono 持续时间?

c++ - 如何初始化 std::unique_ptr<std::unique_ptr<T>[]>?

c++ - 多个服务导出相同的 COM 组件

C++ 性能,for 与 while

c++ - 在编译时检查字符的唯一性

c++ - 如何阻止使用 std::make_shared<T>

c++ - 在嵌套的 lambda 中捕获通用的可调用对象 - 总是向前?

c++ - 在构造函数中接受某些类型

c++ - 在 C++ 中,我可以根据指针类型对元素类型进行类型定义吗?

c++ - 使用带有虚函数的类的构造函数进行大括号初始化