我可以 memcpy() 任何具有微不足道析构函数的类型吗?
Can I memcpy() any type which has a trivial destructor?
我确实意识到is_pod
是类型memcpy
的充分条件,但has_trivial_destructor
也足以达到此目的吗?如果没有,为什么?
No.要求是类型是简单可复制的 (§3.9/2),这还有一些要求,例如缺少非平凡的复制构造函数 (§9/6)。
一个平凡可复制的类是一个类:
— 没有重要的复制构造函数 (12.8),
— 没有不平凡的移动构造函数 (12.8),
— 没有重要的复制赋值运算符 (13.5.3, 12.8),
— 没有重要的移动赋值运算符(13.5.3、12.8),并且
— 有一个微不足道的析构函数 (12.4)。
所以你应该改用is_trivially_copyable
。
一个对象有一个简单的析构函数是不够的。它还需要具有简单的复制操作。例如,对象可以维护指向内部缓冲区的指针。无需销毁任何内容,但复制需要在复制到对象中设置指针,否则它们将指向源对象的缓冲区。
尽管在实践中通常很少见,但可能存在类具有非平凡复制构造函数以及普通析构函数的情况。 考虑一个具有静态成员变量的类,该变量仅计算该类被复制的次数。 如果您memcpy
它,计数器将不准确。
在我看来
,带有纯指针的类有资格成为has_trivial_destructor
,但您通常希望制作一个深拷贝,而memcpy
会创建一个浅拷贝。
相关文章:
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 不命名构造函数和析构函数上的类型错误
- C++中的基元类型有析构函数吗?
- LINUX 操作系统上的错误:令牌之前预期的构造函数、析构函数或类型转换'('?
- 显式调用 typedef'd 类类型的析构函数的正式正确方法
- 即使基类和派生类只使用基元数据类型,我是否需要定义虚拟析构函数
- 在从仅移动类型派生的类中定义析构函数在使用 std::vector emplace_back或push_back创建时会
- 当 T 具有非平凡析构函数时,类类型 T 的对象是否可以常量初始化?
- 非默认析构函数会导致不完整的类型错误
- 错误 c++ 在令牌之前'('预期的构造函数、析构函数或类型转换
- 触发的断点(析构函数)与类模板类型是自身的一个版本
- 错误:在“(”标记之前进行预期的构造函数、析构函数或类型转换.即使我有一个构造函数
- GCC 9.1 返回 void& 作为显式析构函数调用的结果类型。这是一个错误吗?
- 获取错误:在“(”标记之前进行预期的构造函数、析构函数或类型转换
- 不是多态类型,或者为什么我们在这里需要虚拟析构函数?
- 如何销毁通过"放置新"构造的无析构函数类型
- C++联合如何知道其中存储的类型以及要调用哪个析构函数
- 错误:令牌之前的预期构造函数、析构函数或类型转换'*'
- 不同的析构函数类型
- 需要构造函数/析构函数/类型转换错误