C++重載解析

重載解析(overloading resolution)的規則決定了編譯器爲一個函數調用選用哪一個函數定義。通常過程以下:數組

  1. 名稱相同的函數/模板函數找到並建立候選列表
  2. 從中挑選參數數目正確,符合徹底匹配/隱式轉換規則的函數建立可行函數列表
  3. 存在最佳可行函數 ? 使用 : 報錯

徹底匹配包括形參和實參類型徹底同樣或可有可無的轉換,可有可無的轉換包括引用和值之間,數組到指針,函數到函數指針,加上const/volatile限定符。markdown

特殊規則: 當形參是指針/引用時,T&/T*會優先和T&/T*匹配,其次纔是const T&/T*。而若分別定義了T和const T做爲形參,則將產生二義性錯誤。app

部分排序規則(partial ordering rules)

須要較少轉換的候選函數優先級更高,典型地:函數

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。指針

相關文章
相關標籤/搜索