Я читаю стандарт и пытаюсь понять, почему этот код не будет разрешен без актерского состава.Почему эта функция вызывает двусмысленность?
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]
Каждый целочисленный тип имеет ранг целое преобразование определяется следующим образом:
- The ранг любого беззнакового целочисленного типа должен быть равен ранга соответствующего знакового целочисленного типа.
- Ранг char должен равняться рангам подписанного символа char и unsigned .
В частности, что шумит мой jimmies в том, что он не говорит ни о каком неподписанном интегральном типе, просто без знака. Мое предположение заключается в том, что с помощью преобразования char становится беззнаковым типом. Это правда?
Возможно, 123456789U сделает это за вас. – WhozCraig
«В частности, то, что шумит мой jimmies, заключается в том, что он не говорит ни о каком неподписанном интегральном типе, просто неподписанном элементе. Мое предположение заключается в том, что с помощью преобразования char продвигается к беззнакомому типу. Это правда?» - Я бы рискнул, что вы неправильно понимаете значение 4.13 в стандарте ... 'char' не повышается до' unsigned' ... проблема в том, что AndreyT говорит - что 123456789 - это 'int', и это не явно лучше усечь его как «char» или передать его как «unsigned long» («long» будет так же плохо - «unsigned» здесь не значим). –
Несмотря на название, «целочисленный ранг преобразования» на самом деле не используется для ранжирования целочисленных преобразований при разрешении перегрузки. –