C++重载解析困惑:为何两段代码调用结果不同?
C++重载解析歧义问题解析:相同调用为何结果不同?
要搞懂这个问题,核心是C++重载解析的转换优先级规则:编译器会比较候选函数的参数与调用参数的匹配程度,只有当某个候选在所有参数上的转换都不劣于其他候选,且至少有一个参数的转换更优时,才会被选中;如果候选之间各有更优的参数匹配,就会触发歧义。
第一段代码(Code 1)的匹配逻辑
Code 1的两个重载:
#include <iostream> using namespace std; void doThings_A(int ,int ,double){ cout<<"first fxn"<<endl;} //OVERLOAD A void doThings_A(int ,double,double){ cout<<"second fxn"<<endl;} //OVERLOAD B int main() { doThings_A(4,5,6); return 0; }
调用是doThings_A(4,5,6),三个参数都是int类型。逐个分析参数匹配:
- OVERLOAD A:
- 第一个
int参数:精确匹配(无需转换) - 第二个
int参数:精确匹配 - 第三个
double参数:int→double(标准数值转换)
→ 仅需1次转换
- 第一个
- OVERLOAD B:
- 第一个
int参数:精确匹配 - 第二个
double参数:int→double(标准转换) - 第三个
double参数:int→double(标准转换)
→ 需要2次转换
- 第一个
编译器会选择转换更少、匹配更优的候选,因此OVERLOAD A被选中,输出first fxn。
第二段代码(Code 2)的歧义原因
Code 2的两个重载:
#include <iostream> using namespace std; void doThings_A(double ,int ,int){ cout<<"first fxn"<<endl;} void doThings_A(int ,double,double){ cout<<"second fxn"<<endl;} int main() { doThings_A(4,5,6); return 0; }
同样调用doThings_A(4,5,6)(三个int参数),分析参数匹配:
- 第一个重载:
- 第一个
double参数:int→double(标准转换) - 第二个
int参数:精确匹配 - 第三个
int参数:精确匹配
→ 1次转换,但仅第一个参数需要转换
- 第一个
- 第二个重载:
- 第一个
int参数:精确匹配 - 第二个
double参数:int→double(标准转换) - 第三个
double参数:int→double(标准转换)
→ 2次转换,但第一个参数精确匹配
- 第一个
现在比较两个候选的匹配优劣:
- 对于第一个参数:第二个重载的精确匹配比第一个重载的标准转换更优
- 对于第二个、第三个参数:第一个重载的精确匹配比第二个重载的标准转换更优
此时,没有任何一个候选在所有参数上的匹配都不劣于另一个——第二个重载在第一个参数占优,第一个重载在第二、三个参数占优,编译器无法判断哪个是开发者想要的,因此触发ambiguous call错误。
内容的提问来源于stack exchange,提问作者imbot
相关产品推荐
相关产品推荐

