call function 2
如果把函数1的注释去掉再运行,就会发现,虽然第一个调用既能匹配函数1,也能匹配函数2,但是由于匹配函数2的时候,需要const转换,因此比精确匹配要差,最终,它会调用函数1。
去掉函数1的注释后,运行结果如下:
call function 1
通过类型提升实现的匹配
关于类型提升,这里不多做介绍。简单说明类型提升规则:
- float将提升到double
-
char、short和相应的signed、unsigned类型将提升到int
我们来看一个示例:
#include <iostream> using namespace std; //函数1 /* int f(short a) { cout<<"call function 1"<<endl; return 0; }*/ //函数2 int f(int a) { cout<<"call function 2"<<endl; return 0; } int main() { short a = 2; f(a); return 0; }同样地,我们暂时把函数1注释掉。由于a是short类型,但是通过类型提升,可以转换为int,因为它也能调用函数2。运行结果如下:
call function 2
但去掉函数1注释后,由于精确匹配优于通过类型提升的匹配,因此将会调用函数1,运行结果如下:










