文章目录
- 确认候选函数和可行函数
- 寻找最佳匹配
- 含有多个形参的函数匹配
- 实参类型转换
- 需要类型提升和算术类型转换的函数
在大多数情况下,我们容易确定某次调用应该选用哪个重载函数。然而,当几个重载函数的形参数量相等以及某些形参的类型可以由其他类型转换得来时,这项工作就不那么容易了。
确认候选函数和可行函数
函数匹配的第一步是选定本次调用对应的重载函数集,集合中的函数称为候选函数。 候选函数具备两个特征:一是与被调用的函数同名,二是其声明在调用点可见。
第二步考察本次调用提供的实参,然后从候选函数中选出能被这组实参调用的函数,这些新选出的函数称为可行函数。 可行函数也有两个特征:一是其形参数量与本次调用提供的实参数量相等,二是每个实参的类型与对应的形参类型相同,或者能转换成形参的类型。(在有默认实参的情况下,便可以小于等于)
如果没有找到可行函数,程序将要报错无匹配函数的错误
寻找最佳匹配
函数匹配的第三步是从可行函数中选择与本次调用最匹配的函数。在这一过程中,逐一检查函数调用提供的实参,寻找形参类型与实参类型最匹配的那个可行函数。后面将介绍“最匹配”的细节,它的基本思想是,实参类型与形参类型越接近,它们匹配得越好。
含有多个形参的函数匹配
有一个例子,比如传入的参数是(1,2.0),两个重载函数:
//第一个函数
void function(int ,int);
//第二个函数
void function(double,double);
对于多个函数中进行寻找最佳匹配的时候,如果没有一个函数可以直接脱颖而出,超出别人的优先级,那么就存在二义性。
实参类型转换
为了确定最佳匹配,编译器将实参类型到形参类型的转换划分成几个等级,具体排序如下所示:
-
精确匹配,包括以下情况:
(1)实参类型和形参类型相同。
(2)实参从数组类型或函数类型转换成对应的指针类型。
(3)向实参添加顶层const或者从实参中删除顶层const。 -
通过const转换实现的匹配。
-
通过类型提升实现的匹配。
-
通过算术类型转换或指针转换实现的匹配。
-
通过类类型转换实现的匹配.
需要类型提升和算术类型转换的函数
实际上举个例子就明白了。
类型提升的例子:
//第一个函数
void function(int);
//第二个函数
void function(short);
//调用函数
function('a');//实际上调用的是第一个函数,因为char类型进行了类型提升,类型提升优先级更高。
算术类型转换的注意事项:
//第一个函数
void function(long);
//第二个函数
void function(float);
//调用函数
function(3.5);//实际上3.5是double型,对于上述的进行都是进行转换,等级一致而非转成float型,所以是进行二义性报错。