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

C++中为何foo字符串字面量调用会匹配const string&重载函数?

为什么调用的是void foo(const string& s)?

咱们一步步拆解这个问题,先看你执行的调用代码:foo("Hello, I am an referencing string."); —— 这里传入的是一个字符串字面量,它本身是const char[]类型,会被C++隐式转换成一个临时的std::string对象。接下来咱们逐个分析三个重载的匹配可能性:

  • 第一个重载void foo(string& s):这是一个非常量左值引用,它只能绑定到可修改的左值(比如一个有名字的std::string变量),而临时对象属于右值,且C++语法禁止非常量引用绑定临时对象(防止开发者不小心修改无意义的临时值),所以这个重载直接被排除。
  • 第二个重载void foo(string* s):这个重载要求传入一个std::string的指针,也就是得用&运算符取某个字符串变量的地址才行。但你现在传的是字面量转换来的临时对象,语法上不允许直接获取临时对象的地址并传递,所以这个重载也匹配失败。
  • 第三个重载void foo(const string& s):常量左值引用是个特殊情况,它不仅能绑定普通的左值,还能绑定右值(包括临时对象)。当临时的std::string对象被创建后,这个const string&可以完美接收它,编译器会优先选择这个唯一能匹配的重载。

说白了就是:临时对象既没法绑定到非常量引用,也没法直接转成指针,但可以被常量引用安全绑定,所以第三个重载就成了唯一的选择。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:54:43