C++重载调用歧义疑问:按Primer规则为何无法解析?
C++函数调用歧义问题解析
问题背景
代码示例
void f(int) {} void f(const int&) {} int main() { int i = 1; f(i); }
编译现象
在GCC 11.2.0、-std=c++11环境下,调用f(i)时触发函数调用歧义错误。
参考规则(《C++ Primer》第5版6.6.1节「实参类型转换」)
转换优先级排序:
- 精确匹配,包括以下情况:
- 实参与形参类型完全相同;
- 实参从数组或函数类型转换为对应指针类型;
- 为实参添加或丢弃顶层
const。- 通过
const转换实现的匹配。
按照上述规则,f(int)属于精确匹配(类型完全相同),优先级应更高,为何仍出现歧义?
核心原因:两个调用均属于同一优先级的精确匹配
问题出在对底层const和精确匹配范围的理解上:
- 对于
f(int):实参i是int类型,和形参类型完全一致,属于精确匹配的第一种情况。 - 对于
f(const int&):这里的const是底层const(修饰引用指向的对象),C++标准允许将非const的int对象绑定到const int&引用,这种绑定不需要任何类型转换,属于精确匹配的范畴,和f(int)的匹配优先级完全相同。
《C++ Primer》中提到的“添加或丢弃顶层const”指的是类似const int(顶层const)和int之间的转换,而const int&的const是底层const,不在这个范畴内。由于两个函数的匹配优先级没有高低之分,编译器无法确定调用哪一个,因此产生歧义。
内容的提问来源于stack exchange,提问作者Neox
相关产品推荐
相关产品推荐

