重載解析(overloading resolution)的規則決定了編譯器爲一個函數調用選用哪一個函數定義。通常過程以下:數組
徹底匹配包括形參和實參類型徹底同樣或可有可無的轉換,可有可無的轉換包括引用和值之間,數組到指針,函數到函數指針,加上const/volatile限定符。markdown
特殊規則: 當形參是指針/引用時,T&/T*會優先和T&/T*匹配,其次纔是const T&/T*。而若分別定義了T和const T做爲形參,則將產生二義性錯誤。app
須要較少轉換的候選函數優先級更高,典型地:函數
template <typename T> void foo(T t); template <typename T> void foo(T* t); /* ... */ int a; foo(&a);
此處foo(&a)
將與第一個模板匹配,由於第二個模板多了一個int模板到形參int*的轉換過程。url
常見誤區:數組形參spa
template <typename T> void foo(T a[]); template <typename T> void foo(T * a[]); /* ... */ int a = 1, b = 2, c = 3; int *pd[] = {&a, &b, &c}; foo(pd);
注意這裏對T * a[]
的解析,是一個指向類型爲T *
的數組。當模板替換的時候,T * []
將做爲該數據的類型總體,所以不存在上述的多一個轉換過程的狀況。且模板2比模板1更具體,所以將選擇模板2。指針