有人可以解釋爲什麼重載解析會選擇第二個函數,而不是報告一個模糊的錯誤。無論如何,第二個函數是完全匹配的,但第一個函數需要進行資格轉換(從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);
}
我無法理解「你說的兩個都是完全匹配是正確的」如何? –
@GilsonPJ所需轉換(數組到指針和限定)的級別是精確匹配,因此整個轉換序列也是精確匹配。 – user657267
@Gilson:基本上都是完全匹配,並且具有相同的排名......但是關於cv-qualification的特殊規則勝過了這一點,並給出了#2優先級。簡而言之:**它只是**。 –