对已被移动的对象赋值新值后,能否安全继续使用该对象?
问题解答
你的判断完全正确,赋值新值后的str1处于有效状态,完全可以安全使用。
核心原因
C++标准明确规定:被移动后的对象处于有效但未定义的状态。这意味着:
- 你不能依赖该对象的原有值或状态
- 但可以对它执行不依赖当前状态的合法操作,其中就包括赋值操作(
operator=)
针对示例代码的分析
- 执行
std::string str2{std::move(str1)}后,str1进入有效未定义状态,此时直接读取str1的值是未定义行为,但调用赋值运算符是完全合法的。 - 当执行
str1 = "This is a new content of this string"后,str1会被重新初始化,恢复到一个完全正常的有效状态。后续对str1的任何标准操作(比如读取内容、修改、作为函数参数传递等)都是安全且符合标准的。
通用规则
对于所有符合C++标准的类型(比如所有STL容器),移动后的对象都支持通过赋值操作来恢复到可正常使用的有效状态,这是标准所保证的行为。
内容的提问来源于stack exchange,提问作者Alexey104
相关产品推荐
相关产品推荐

