Подтвердить что ты не робот

Почему эта функция вызывает двусмысленность?

Я читаю стандарт и пытаюсь понять, почему этот код не будет разрешен без трансляции.

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 продвигается к беззнакомому типу посредством преобразования. Это правда?

4b9b3361

Ответ 1

Он имеет мало общего с рангом типа, определенного в 4.13. 4.13. Определенные внутренние ранжирования, используемые для описания интегральных рекламных акций и обычных арифметических преобразований. Они сами по себе непосредственно не влияют на разрешение перегрузки. Рейтинги, относящиеся к разрешению перегрузки, определены в "13.3.3.1.1 Стандартные последовательности преобразования", а затем используются в "13.3.3.2. Оценка неявных последовательностей преобразования".

Итак, речь идет о ранге преобразования, как определено в 13.3. 123456789 - целочисленный литерал типа int на вашей платформе. Это означает, что вызов обеих версий char и unsigned long для вашей функции требует неявного преобразования от int до char или от int до unsigned long. В обоих случаях мы имеем преобразования типа "интегрального преобразования". Это означает, что в этом случае обе функции одинаково "плохи". Отсюда и двусмысленность.

Если одна из этих функций требовала простого интегрального продвижения (в отличие от интегральной конверсии), она выиграла бы эту резолюцию, и вызов будет считаться однозначным. Но, увы, обе ваши функции требуют целых преобразований.