C++重载函数的最佳匹配问题

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的 非常量引用类型, 这个编译器是可以区分的

img

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这篇博客: C Primer Plus 第四章 复习题&编程练习 答案中的 8. 编写一个程序,提示用户输入旅行的里程和消耗的汽油量。然后计算并显示消耗每加仑汽油行驶的英里数,显示小数点后面一位数字。接下来,使用1加仑大约3.785升,1英里大约为1.609千米,把单位是英里/加仑的值转换为升/100公里(欧洲通用的燃料消耗表示法),并显示结果,显示小数点后面 1 位数字。注意,美国采用的方案测量消耗单位燃料的行程(值越大越好),而欧洲则采用单位距离消耗的燃料测量方案(值越低越好)。使用#define 创建符号常量或使用 const 限定符创建变量来表示两个转换系数。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:
    #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;
    }
    

    运行结果:
    在这里插入图片描述
    在单位转换软件上,验证了一下运行结果:
    在这里插入图片描述


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^