B.1何时应用重载解析
重载解析可以看作是函数调用整个完整处理过程的一部分。首先,如果是通过指针或者成员函数指针来进行调用,就不会进行重载解析:因为究竟调用哪一个是在运行期由指针(实际所指的对象)来决定的。另外,类似函数的宏不能被重载,因此就不会进行重载解析。
B.2简化过的重载解析
重载解析通过比较调用实参和候选参数的匹配程度,来对所有的可行候选函数进行分级,对于匹配级别高的候选函数,它每个参数的匹配程度都不能低于匹配级别低的候选函数的相应参数的匹配程度。下面的例子说明了这一点:
void combine(int,double);
void combine(long,int);
int main()
{
combine(1,2);//二义性
}
这个例子中,因为一个候选函数可以最佳匹配第一个参数,而第二个候选函数可以最佳匹配第二个参数,。我们可能觉得:从某种意义上而言,int与long的相似度要比int与double相似度高(因此选择第二个),但是C++并不会试图度量这种涉及到多个调用实参的相似度,从而引发二义性。
根据分级原则,我们可以对下面的匹配精心分级(从最佳到最差):
1) 完美匹配。(参数的类型和实参(表达式)的类型相同,或者参数的类型是指向实参类型的引用(也可以增加const或者volatile限定符))
2) 有细微调整的匹配。
3) 发生提升的匹配。(提升是一种隐式类型转换,它包含包占位少的整数类型(bool,char,short或者枚举)转换为占位多的类型(int,unsigned int,long或者unsigned long),还包括从float到double的转换。
4) 发生标准转换的匹配。(这包含任何种类的标准转换,但并不包含隐式调用的类型转换运算符和单参数构造函数)
5) 发生用户自定义转型的匹配。(允许任何种类的隐式转换)
6) 和省略号的匹配。(省略号可以匹配任何类型(但匹配非POD(plain old data&