You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

std::move后原对象是否仍有效?可重新赋值或转移资源吗?

std::move后对象的赋值合法性问题

针对你提到的两个vector操作场景,结论都是完全合法且可行,下面具体说明:

场景一:移动后给对象重新赋值

//假设vecA、vecB和vecC都是vector
vecA = std::move(vecB);
//其他代码...
vecB = vecC;//是否合法?

std::move(vecB)仅将vecB的内部资源转移给vecA,此时vecB会进入标准库容器规定的合法空状态——它可以被安全地赋值、销毁或执行其他不依赖原有资源的操作。给vecB赋值vecC时,vecB会重新分配资源(或复用内部空容器的结构),完全恢复正常使用状态,不存在任何未定义行为。

场景二:移动后将资源转移回原对象

vecA = std::move(vecB);
//尝试重新获取资源控制权
vecB = std::move(vecA);

这个操作同样可行。vecA在接收vecB的资源后成为有效容器,std::move(vecA)会把资源再次转移给vecB,操作完成后vecA回到合法空状态,vecB重新持有原有的资源,整个流程完全符合C++标准要求。

关键注意点

  • 对于所有标准库类型(如vector、string、unique_ptr等),被移动后的对象都保证处于可赋值、可销毁的状态,这是标准强制要求的。
  • 如果是自定义类型,实现移动构造/赋值时必须遵循同样规则:移动后的对象不能处于无效状态,必须支持后续的赋值、析构操作,否则会引发未定义行为。

内容的提问来源于stack exchange,提问作者hu4nghe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 19:18:13