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

执行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会针对这类代码触发自移动警告,中文翻译如下:

警告:将类型为'std::string'(别名'std::__cxx11::basic_string')的's'移动到自身 [-Wself-move]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 07:40:22