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

为何std::string与char*字面量交换位置比较仍可正常编译运行?

为什么字面量在前的字符串比较能正常编译运行?

你的核心误区是只想到了std::string的成员operator==,但忽略了C++标准库为std::string提供的非成员重载运算符。

具体原因

C++标准库中定义了针对std::string的非成员operator==重载,其中就包含适配const char*和std::string的版本:

bool operator==(const char* lhs, const std::string& rhs);

当你写"done" == s时:

  1. "done"的实际类型是const char[5](包含末尾的空终止符),会隐式转换为const char*;
  2. 编译器会匹配上面的非成员重载函数,完成和s == "done"完全一致的字符串内容比较,自然不会报错,运行行为也和版本1一致。

关于你关心的赋值防护

你把字面量放前面的初衷——防止把==误写成=——依然有效:如果不小心写成"done" = s,编译器会直接报错,因为字符串字面量是不可修改的常量,无法被赋值;而如果是s = "done"则是合法的赋值操作,这种写法确实能避免这类低级错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 10:50:54