自移动std::string是否具备可移植性?是否为C++标准强制要求?
核心结论
- 你写的自移动赋值代码在C++标准层面属于未定义行为,合法性不是标准强制要求的
- 这种写法仅在部分STL实现下能正常运行,可移植性极差,即使看起来更简洁也不建议在生产环境使用。
具体解释
你给出的代码示例:
std::string s = "y"; s = "x" + std::move(s) + "x"; Send(std::move(s));
C++标准仅要求:对象被移动后,处于「有效但未指定」的合法状态,全程没有对自移动赋值的场景做任何强制安全保障。
- 目前主流STL实现(包括GNU libstdc++、llvm libc++、微软STL的release模式)的
std::string移动赋值采用内部缓冲区直接交换的实现逻辑,自移动场景下确实不会出现崩溃、脏数据等问题,但这只是实现的自发选择,不属于标准强制规定。 - 微软STL的debug模式加的自移动检查,就是专门用来提醒开发者编写了依赖实现特性的非标准代码,避免代码跨编译器、跨版本运行时出现不可预期的问题。
写法对比建议
单看语法简洁性确实你的写法更短,但生产代码优先要保障的是确定性和可移植性:
- 直接调用成员函数的方案
s.insert(s.begin(), 'x'); s.append("x");没有任何理解成本,完全符合标准要求,也没有额外性能开销。 - 多声明一个临时变量存拼接结果的方案,在现在的编译器优化下,也不会产生多余的拷贝或者移动开销,可维护性反而更高。
内容的提问来源于stack exchange,提问作者OwnageIsMagic
相关产品推荐
相关产品推荐

