C++ primer书的第219页提到重载函数的匹配优先级为:
为了确定最佳匹配,编译器将实参类型到形参类型的转换划分成几个等级,具体排序如下所示:
1.精确匹配,包括以下情况:
实参类型和形参类型相同。
实参从数组类型或函数类型转换成对应的指针类型(参见6.7节,第221页,将介绍函数指针)。
向实参添加顶层 const或者从实参中删除顶层const。
2.通过const转换实现的匹配(参见4.11.2节,第143页)。
3.通过类型提升实现的匹配(参见4.11.1节,第142页)。
4.通过算术类型转换(参见4.11.1节,第142页)或指针转换(参见4.11.2节,第143
页)实现的匹配。5.通过类类型转换实现的匹配(参见14.9节,第514页,将详细介绍这种转换)。
其中1.的最后一句话“向实参添加顶层const或者从实参中删除顶层const”和2.中的“通过const转换实现的匹配”这句话之间有什么不同的含义?
在编写代码测试的时候,发现部分代码会出现函数匹配二义性问题,但是并没有明白为什么会出现这种问题:
void fun1(const string &h){ }
void fun1(string h){ }
void fun2(const string &h){ }
void fun2(string &h){ }
int main() {
string h1("abcd");
fun1(h1); //这行代码报错,出现二义性问题
fun2(h1);
return 0;
}
我在网上找一些关于重载函数匹配的文章,没有找出合适的答案,故来询问各位大lao,希望各位大lao能够解答一下。
fun1 因为它们的 函数名 和 参数类型 和 个数都相同,编译器无法区分
fun2 因为 有一个是 string 的常量引用类型, 一个是 string的 非常量引用类型, 这个编译器是可以区分的
#include <stdio.h>
#define distance_CONVERT 1.609
#define Gasoline_CONVERT 3.785
int main(void)
{
float distance, Gasoline_quantity;
printf("请输入旅行的里程(英里)和消耗的汽油量(加仑):");
scanf("%f %f",&distance,&Gasoline_quantity);
printf("显示消耗每加仑汽油行驶的英里数:%.1f\n",distance/Gasoline_quantity);
printf("把单位是英里/加仑的值转换为升/100公里:%.1f\n",(Gasoline_quantity*Gasoline_CONVERT)/(distance*distance_CONVERT)*100);
return 0;
}
运行结果:
在单位转换软件上,验证了一下运行结果: