#include <iostream>
using namespace std;
void f(char c)
{
cout << c <<endl;
}
void f(int i)
{
cout << i <<endl;
}
int main()
{
double d = 2.0;
f(d);
return 0;
}
上述代码中f(d)调用会产生二义性。
重载解析的步骤:
1、确定函数调用考虑的重载函数的集合,确定函数调用中的实参属性。
2、从重载函数集合中选择的函数,该函数可以在(给出实参个数和类型)的情况下用调用中指定的实参进行调用。
3、选择与调用最匹配的函数。
在我们 给的实参和重载函数类型不是精确匹配时,而是要通过一定的数据类型转换来得到则要准寻下列原则:
1、应用在实参上的转换不比调用其他可行函数所需的转换差。
2、在某些实参上的转换要比其他可行函数对该函数的对该参数的转换好。
ps:精确匹配比标准抓换好(不转换比任何转换好)。c++ primer 383 有详细说明。
因为上面例子中我们在执行f(d);的时候,有两个候选函数。而且在通过数据类型转换从而得到匹配函数时,出现二义性。