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

基于const参数的C++函数重载:编译器匹配逻辑疑问

C++ const参数重载的匹配问题

示例代码

#include <iostream>

using std::cout;

class CheckConst
{
public:
    void func(int* p)
    {
        cout << "func called";
    }

    void func(const int* p)
    {
        cout << "const func called";
    }
};

int main()
{
    int* p = nullptr;
    CheckConst obj;
    obj.func(p);
}

疑问

上述基于const参数的C++函数重载代码可正常运行,但存在疑问:调用obj.func(p)时两个重载函数均适用,且移除任意一个函数代码仍能正常运行,为何编译器不会报错?编译器是如何区分并选择调用哪个函数的?

解答

这是C++重载决议机制里的最佳匹配原则在主导:

  • 对于int*类型的实参p,第一个重载func(int* p)是精确匹配——不需要任何类型转换就能直接匹配,这是优先级最高的匹配方式。
  • 虽然int*可以隐式转换为const int*(非const指针转const指针是安全的只读转换),但这种转换属于低优先级的提升转换,比精确匹配的优先级低。

编译器在处理重载调用时,会遍历所有可行的重载函数,选出所需转换最少、优先级最高的那个。这里第一个重载是精确匹配,优先级远高于需要转换的第二个,所以编译器直接选择func(int* p),不会出现二义性错误。

至于移除任意一个函数仍能运行的原因:

  • 删掉第一个重载时,int*可以隐式转换为const int*,顺利匹配第二个重载;
  • 删掉第二个重载时,直接匹配第一个重载,两种情况都是合法的匹配路径,因此单独存在时都能正常编译运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 15:07:37