Я читаю стандарт и пытаюсь понять, почему этот код не будет разрешен без трансляции.
void foo(char c) { }
// Way bigger than char
void foo(unsigned long int) { }
int main()
{
foo(123456789); // ambiguous
foo((unsigned long int) 123456789); // works
}
Вот что он говорит:
4.13 Integer ранг преобразования [conv.rank]
Каждый целочисленный тип имеет целочисленный ранг преобразования следующим образом:
- Ранг любого целого числа без знака должен быть равен рангам соответствующий тип целочисленного знака.
- ранг char должен равняться рангам подписанного char и без знака char.
В частности, что шумит мой jimmies, так это то, что он не говорит ни о каком неподписанном интегральном типе, просто без знака char. Я предполагаю, что char продвигается к беззнакомому типу посредством преобразования. Это правда?