簡體   English   中英

C ++對帶有unsigned int的重載函數的模糊調用

[英]C++ ambiguous call to overloaded function with unsigned int

這似乎不一致。 我有3個功能f重載符號類型shortintlong 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簽名,所有浮點類型都比doubledouble都要窄。

所以這是f((unsigned short)0)情況,真是奇怪的人。

http://en.cppreference.com/w/cpp/language/implicit_conversion

積分促銷不會讓你unsigned int ,以long long

整體推廣確實可以讓你從unsigned shortint

來自unsigned int積分轉換被認為同樣適用於您的重載。

促銷以int和/或unsigned int 結尾 ,除非您的源類型是enum ,需要更大的整數類型才能適合它。

促銷比轉換更受歡迎,因此您的第一個案例是明確的。 在第二種情況下,沒有升級路徑,因此您的代碼含糊不清。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM