为什么 std::memmove 中联合的默认非平凡移动构造函数C++?
Why is the default nont-trivial move constructor of unions in C++ std::memmove?
假设联合拥有一个具有非平凡移动构造函数的类类型,如std::shared_ptr
(或std::string
?现在使用std::move
将此联合移动到另一个联合。当源对象超出范围时,它将被销毁,对吗?但是,如果在移动时未将其设置为"empy"状态,则可能会释放其析构函数中实际上应属于新位置的资源。这种行为不是很危险吗?- 特别是因为类/结构类型的默认非平凡移动构造函数是不同的,因为它执行成员级移动,允许成员清理源对象。
一个union
类型,它包含一个成员,其移动构造函数是非平凡的,将有一个已删除的隐式移动构造函数。此外,尝试= default
移动构造函数也会将其删除。实质上,此类类型不可能有有效的移动默认行为。
因此,如果我们有一个union
,它有一个具有非平凡移动构造器的成员,并且您可以合法地移动构造一个,那么该union
上必须有一个用户定义的移动构造函数。因此,用户有责任确保移动构造函数为当前活动成员执行正确的操作。
移动构造函数或移动赋值运算符需要使移动对象处于未知(除非记录(、有效和可破坏的状态。如果不这样做,那么移动构造函数/运算符就会被破坏。
如果您从对象移动并且它的移动构造函数使 moved-from 对象处于删除它会导致资源或类似资源双重删除的状态,那么实现移动构造函数/运算符的人都没有正确完成这项工作。
相关文章:
- 将对象移动到std::shared_ptr
- 何时在引用或唯一指针上使用移动语义
- 如何从具有移动语义的类对象中生成共享指针
- 将shared_ptr移动到<StructA>shared_ptr<变体<结构A、结构 B>>
- C / C++ 移位/偏移/向左或向右移动位图?
- MSVC将仅移动结构参数解释为指针
- 自定义先决条件对移动分配运算符有效吗
- 返回值优化:显式移动还是隐式
- 当有分配器意识的容器被复制/移动时,反弹分配器是否被复制/移走
- 为什么复制而不是移动数据元素?
- 可以使用移动语义更改或改进此C++代码吗?
- 使lambda不可复制/不可移动
- c++在使用指针时移动语义
- 将QGraphicsItem的移动区域限制在多边形区域内
- SendInput()鼠标移动计算
- 按值 C++ 返回时进行双倍移动
- 移动二维数组中的字符
- 为什么不调用移动构造函数?(默认情况下只有构造器,没有别的)
- 安全到标准:移动会员?
- OpenVR:向视图方向移动