候選--->可行--->最佳
候選:
1、與被調用的函數同名。
2、其聲明在調用點可見。
可行:
1、其形參數量與本次調用提供的實參數量相等。
2、每個實參的類型與對應的形參類型相同,或者能轉換成形參的類型。
最佳:
1、 精確匹配:
l 實參類型和形參類型相同
l 實參從數組類型或函數類型轉換成對應的指針類型
l 向實參添加頂層const或者從實參中刪除頂層const(也就是說頂層const對匹配無影響)
2、 通過const轉換實現的匹配
3、 通過類型提升實現的匹配
4、 通過算術類型轉換實現的匹配
5、 通過類類型轉換實現的匹配
Record lookup(Account&);
Record lookup(const Account&);
const Account a;
Account b;
lookup(a); //調用Record lookup(const Account&)
lookup(b); //調用Record lookup(Account&)
底層const是能區分最佳與否的,首先不能將普通引用綁定到const對象上。要不然常量將會被普通引用修改。所以lookup(a)只能調用Record lookup(const Account&)。
而lookup(b),兩種函數都可調用,然而Record lookup(Account&)精確匹配,
而Record lookup(const Account&)需要將Account轉換成const Account,
所以Record lookup(const Account&)更佳。
在以前還沒有函數原型的概念的時候,函數調用,實參只做類型提升,小整形一般都會提升到int類型或更大的整數類型。而浮點類型一般提升到double。有了函數原型後,需要進行進一步的處理,提供可能需要的類型轉換。
void ff(short);
ff(‘a’); //char被提升到int,再由int隱式類型轉換成short。
如果本作用域下還有個void ff(int)函數,那麼通過最佳匹配的原則3和原則4,優先調用通過類型提升的匹配,char先會類型提升到int,所以將調用形參爲int的版本。