[英]C++ ambiguous call to overloaded function with unsigned int
這似乎不一致。 我有3個功能f
重載符號類型short
, int
和long long
。 如果你傳遞一個unsigned short
那么它會被提升為下一個最大的signed類型int
。 但是,如果你傳遞unsigned int
那么它不會被提升為signed long long
,這是我所期望的,而是編譯器抱怨對重載函數的模糊調用。
void f(short x) { std::printf("f(short)\n"); }
void f(int x) { std::printf("f(int)\n"); }
void f(long long x) { std::printf("f(long long)\n"); }
int main()
{
f((unsigned short)0); // Fine: calls f(int)
// f((unsigned int)0); // Ambiguous: could be f(short), f(int) or f(long long)
}
這是不一致的,是的,但它是The Way The Language Is,你必須應對,例如,如果你想要f((unsigned int)0)
來調用long long
overload,那么提供一個包裝器,
inline void f(unsigned int x) { f((long long)x); }
C ++的設計者理想地喜歡讓你的兩種情況都失敗了重載決議。 但是有這個傳統的東西(一直回到“K&R”C),稱為“默認參數提升”,基本上說,如果需要匹配函數,編譯器將隱式地將所有比int
更窄的整數類型轉換為int
簽名,所有浮點類型都比double
和double
都要窄。
所以這是f((unsigned short)0)
情況,真是奇怪的人。
http://en.cppreference.com/w/cpp/language/implicit_conversion
積分促銷不會讓你unsigned int
,以long long
。
整體推廣確實可以讓你從unsigned short
到int
。
來自unsigned int
積分轉換被認為同樣適用於您的重載。
促銷以int
和/或unsigned int
結尾 ,除非您的源類型是enum
,需要更大的整數類型才能適合它。
促銷比轉換更受歡迎,因此您的第一個案例是明確的。 在第二種情況下,沒有升級路徑,因此您的代碼含糊不清。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.