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
相关产品推荐
相关产品推荐

