c++允许函数重载,有时候会遇到这样一个问题:实参可以匹配多个重载版本,或者实参经过隐式转化可以匹配多个重载版本。
这时候编译器就得进行选择,选择一个最匹配的函数进行调用。
关于匹配,有些名词需要说明:完全匹配、提升转换、标准转换、自定义转换。

c++ 匹配优先级:完全匹配>提升转换>标准转换>自定义转换。
如果有多个与实参完全匹配的函数,编译器可能会报错,但是下面这些情况,完全匹配仍然可以优中选优。
情况1:如果实参是左值,形参有左值引用和右值引用两个版本,则优先使用左值引用。
情况2:如果实参是非const左值,形参有非const左值引用和const左值引用两个版本,则优先使用非const左值引用。请不要对这个情况进行推广,这里的情况强调形参是引用。如果形参不是引用,但有const和非const版本,而实参是左值。编译器会报错。因为不知道应该调用const版还是非const版。
情况3:一个完全匹配的函数是模板函数,但另一个是普通函数,则普通函数优先。

完全匹配

完全匹配是指实参不需要任何转换就能赋值给形参。下面情况属于完全匹配。

总结来说,就是形参可以比实参多一个const,多一个&,多两个&&,或者和实参一模一样。
另外,type[]的实参可以完全匹配type *

提升转换

指像short转int,float转double之类的类型本质相同,只是位数不同的转换。提升后的类型可以表示提升前类型的所有取值。

标准转换

指像int转double,double转int之类的。这类转换要么他们的存储实质不同,要么转换后的类型的取值范围并不包含转换前的所有取值。

自定义转换

指用于定义的类形转换为其他类型。

03-28 23:35