基于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
相关产品推荐
相关产品推荐

