c++ 调用函数,编译器查找函数过程

发布时间 2023-05-01 20:10:01作者: _Explosion!

假设此处调用函数 

int a=1;
float b=1.0;
func(a, b);    //调用函数

若func为非模板函数,编译器查找所有的名称为func的函数,然后检查函数入参的数量,再然后检查每个入参是否都可以转换到目标类型。(此处注意,如果参数类型为类对象,若该类支持隐式转换,那么会出现如下情况:

class Test{
    int x;
    Test(int n):x(n){}
}

void func(Test &t,float k);
//...
func(1,1.0);    //合法,1被隐式转换为了Test(1)临时变量

)

如果检索到唯一的函数,则调用该方法;如果有多个函数符合,编译器会挑选出最佳重载的方法进行调用,如果挑选不出,编译器就会报错(歧义错误 ambigouous error)。

 


 

若func为模板函数,编译器将会查找名称与入参类型都要完全匹配的模板方法。看下面这个例子:

class Test{
public:
int x; Test(int n):x(n){} } template<typename T> void func(T &a,T &b); //... func(1,1.0); //非法
Test t(1);
func(1,t);    //非法
 

此时第一次调用func入参为1,1.0,类型为int和double,没有匹配的模板。

第二次调用func入参为1,1.0,类型为int和Test,没有匹配的模板。

也就是说,编译器寻找匹配的模板函数时,不会去考虑隐式转换而是先考虑参数类型。