2016-08-12 62 views
9

有人可以解釋爲什麼重載解析會選擇第二個函數,而不是報告一個模糊的錯誤。無論如何,第二個函數是完全匹配的,但第一個函數需要進行資格轉換(從char *到const char *)。然而,來自http://en.cppreference.com/w/cpp/language/overload_resolution
的文件指出,資格轉換也是精確匹配,因此兩個候選人應具有相同的排名。C++函數重載與精確匹配

每種類型的標準轉換序列的分配的三個等級之一:

1)完全匹配:無需轉換,左值到右值轉換,資格轉換,函數指針轉換,(因爲C + 17)用戶定義的類型的轉換到同一類

2)促進:積分推廣,浮點促進

3)轉化率:積分轉換,浮點轉換,浮積分轉換,指針轉換,pointer-to-memb呃轉換,布爾轉換,派生類的用戶定義轉換到它的基地

void g(const char* x) 
{ 
    std::cout << "g(const char* x)" << std::endl; 
} 

void g(char* x) 
{ 
    std::cout << "g(char* x)" << std::endl; 
} 

void callg() 
{ 
    char a[] = "sample"; 
    g(a); 
} 

回答

8

兩個函數都需要一個陣列到指針的轉換,但所述第一需要額外的資格轉換。

你在說都是一個精確匹配是正確的

[over.ics.scs/3

[...]轉換序列的等級是考慮確定序列中每次轉換的等級和任何參考結合的等級(13.3.3.1.4)。如果其中任何一個有轉換等級,則該序列具有轉換等級;否則,如果其中任何一個具有促銷等級,則該序列具有促銷等級;否則,該序列具有完全匹配等級。

但根據在[over.ics.rank]/3.2

標準轉換序列的規則S1S2如果

[標準轉換序列的更好的轉換序列... ]

(3.2.5) - S1S2只有不同的資格轉換和產量類似的類型T1T2(4.4),並且T1類型的cv資格簽名是T2類型的cv資格簽名的適當子集。

同樣的規則是你

3)標準轉換序列S1比標準轉換序列更好「隱式轉換序列本位」下的鏈接頁面上S2如果

[...]

F)或者,如果不是,S1S2僅在資格轉換不同,和S1結果的CV-資質的S2

+0

我無法理解「你說的兩個都是完全匹配是正確的」如何? –

+0

@GilsonPJ所需轉換(數組到指針和限定)的級別是精確匹配,因此整個轉換序列也是精確匹配。 – user657267

+0

@Gilson:基本上都是完全匹配,並且具有相同的排名......但是關於cv-qualification的特殊規則勝過了這一點,並給出了#2優先級。簡而言之:**它只是**。 –

0
結果的CV-資格的一個子集

在重載分辨率中,T *和const T *被視爲不同的參數類型。 [over.load] 13.1 /(3.4):

特別地,對於任何類型的T, 「指針T」, 「指針爲const T」,和 「指針到易失性T」 被認爲是不同的參數類型,如「對T的引用」,「對const T的引用」和「對易失性T的引用」。