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

重载函数调用优先级 : 普通函数 > 模板函数 > 类型提升的匹配  

 

假设此处调用函数 

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,没有匹配的模板。

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

posted @ 2023-05-01 20:03  _Explosion!  阅读(110)  评论(0编辑  收藏  举报