练习6.49
候选函数:调用函数时对应的重载函数集中的函数被称之为候选函数。主要有2个特征:一是与被调用的函数同名,二是其声明在调用点可用。
可行函数:从候选函数中选出来的能被这组实参调用的函数被称之为可行函数。主要有2个特征:一是其形参的数量与本次调用提供的实参数量相等。二是每个实参的类型与对应的形参的类型相同,或者能转换成形参的类型。
练习6.50
void f();
void f(int);
void f(int, int);
void f(double, double = 3.14);
(a)
f(2.56,42);
可行函数包括f(int,int)和f(double,double)。
只考虑第一个实参2.56时,函数f(double,double)能精准匹配,要想匹配第二个函数,int类型的实参就必须转换成double类型。显然需要内置类型转换的匹配劣于精准匹配,因此就第一个实参来说,f(double,double)比f(int,int)更好。
接着考虑第二个实参42,此时f(int,int)是精准匹配,要想调用f(double,double)必须将42从int类型转换成int类型。因此仅就第二个实参来说,f(int,int)更好。
编译器最终因为这个调用具有二义性而拒绝其请求:因为每个可行函数各自在一个实参上实现了更好的匹配,从整体上无法判断孰优孰劣。
(b)
f(42);
完美匹配f(int)函数。
©
f(42,0);
完美匹配f(int,int)函数。
(d)
f(2.56,3.14);
完美匹配f(double,double)函数。
练习6.51
void f() {
cout << "NO.1" << endl;
}
void f(int) {
cout << "NO.2" << endl;
}
void f(int, int) {
cout << "NO.3" << endl;
}
void f(int, int, int) {
cout << "NO.4" << endl;
}
int main() {
f();
f(3);
f(5, 7);
f(9, 11, 13);
}