我正在閱讀標準,並試圖找出爲什麼這個代碼不會被解決沒有演員。爲什麼這個函數調用不明確?
void foo(char c) { }
// Way bigger than char
void foo(unsigned long int) { }
int main()
{
foo(123456789); // ambiguous
foo((unsigned long int) 123456789); // works
}
這裏是這樣說的:[conv.rank]
每個整數類型都有一個整數轉換等級定義 如下
4.13整數轉換排名:
- 的任何無符號整數類型的等級應等於對應的有符號整數類型的等級。
- 字符的排名應等於有符號字符和無符號字符的排名。
特別是,我的吉姆斯沙沙什麼是它沒有說任何無符號整型,只是無符號字符。我的猜測是,通過轉換將char提升爲無符號類型。這是真的?
也許123456789U會爲你做。 – WhozCraig 2014-09-24 07:30:45
「特別是,我的吉姆斯的沙沙聲是它沒有說任何無符號的整數類型,只是無符號的char。我的猜測是char通過轉換被提升爲無符號類型,這是真的嗎?」 - 我認爲你誤解了標準中4.13的意義......'char'沒有被提升爲'unsigned' ......問題在於AndreyT說 - 123456789是一個int類型,它是不是明顯更好地將其截斷爲'char'或將其作爲'unsigned long'傳遞('long'將會同樣糟糕 - 'unsigned'在這裏並不重要)。 – 2014-09-24 07:37:02
儘管名稱存在,但在重載解析期間,「整數轉換排名」實際上並未用於對整數轉換進行排名。 – 2014-09-24 09:08:59