C++ Primer 学习笔记——函数匹配
下面以一个例子说明函数匹配的过程:(文章主要内容摘自C++ Primer)
void fun(int a, int b) {
cout << "fun" << endl;
}
void fun(int a, int b, int c) {
cout << "fun1" << endl;
}
void fun(double a, double b, double c) {
cout << "fun2" << endl;
}
fun(1, 2, 3); //A
fun(1, 2, 1.2); //B
确定候选函数和可行函数
函数匹配的第一步是选定本次调用对应的重载函数集,集合中的函数称为候选函数。候选函数具有两个特征:一是与被调函数同名,二是函数的声明在调用点可见。此处,有三个名为 fun 的候选函数。
第二步考察本次调用提供的实参,然后从候选函数中选出能被这组实参调用的函数,这些函数称为可行函数。可行函数也有两个特征:一是其形参数量与本次调用提供的实参数量相等,二是每个实参的类型与对应的形参类型相同,或者能转换成形参的类型。对于上面代码的 A 调用和 B调用,可以选出两个可行函数,即三参数的 fun 函数。
寻找最佳匹配
在可行函数中,编译器一次检查每个实参以确定那个函数时最佳匹配,如果有且只有一个参数满足下列条件,则匹配成功:
- 所有实参的匹配都不劣于其他可行函数需要的匹配
- 至少有一个实参的匹配由于其他可行函数的匹配
若是检查所有函数后,没有一个函数能作为最佳匹配,则调用错误,编译器将报告二义性调用的信息。
在本文开始的码中,A 调用匹配形参为三个 int 的 fun 函数(下文称形参为三 int 参数的fun函数为 fun1,形参为三 double 的 fun 函数为 fun2)时,同时满足上述两个条件,因此 A 调用了 fun1 。而对于 B 调用,虽然匹配 fun1 时前两个参数的匹配优于 fun2 ,但第三个参数的匹配却劣于 fun2。因此,按照上述两个条件,选不出最佳匹配,对于 B 调用编译器将报错。