执行s=std::move(s)时std::string的行为:各编译器结果不同是否合法?
关于
s=std::move(s)自移动赋值的分析 - 普遍观点认为,
s=std::move(s)这种右值到左值的自赋值操作,应该和常规自赋值s=s一样被检查并阻止,但实际这类检查属于冗余代码,且很难想象这种场景会在真实业务逻辑中出现。 - 为验证默认移动赋值的表现,用GCC、Clang和MSVC编译运行了以下测试代码:
#include <iostream> #include <string> #include <utility> int main() { std::string s{"asdfasdfasdfasdf"}; s=std::move(s); std::cout << "String is: " << s << '\n'; }
- 测试结果:
- GCC和Clang执行后,
s会被置为空字符串 - MSVC执行后,
s保持原内容不变
- GCC和Clang执行后,
- 重点说明:上述三种编译器的实现均符合标准,结果差异是被允许的,该操作不属于未定义行为。
- 额外提示:GCC和Clang会针对这类代码触发自移动警告,中文翻译如下:
警告:将类型为'std::string'(别名'std::__cxx11::basic_string')的's'移动到自身 [-Wself-move]
内容的提问来源于stack exchange,提问作者doug
相关产品推荐
相关产品推荐

