Почему самое отрицательное значение int вызывает ошибку о неоднозначных перегрузках функций?
я узнаю о перегрузке функций в C++ и наткнулся на это:
void display(int a)
{
cout << "int" << endl;
}
void display(unsigned a)
{
cout << "unsigned" << endl;
}
int main()
{
int i = -2147483648;
cout << i << endl; //will display -2147483648
display(-2147483648);
}
насколько я понял, любое значение, указанное в элементе
3 ответа:
это очень тонкая ошибка. То, что вы видите, является следствием отсутствия отрицательных целочисленных литералов в C++. Если мы посмотрим на [Лекс.значок] мы получаем, что a integer-literal,
integer-literal
десятичное-литеральное целое число-суффикс opt
[...]может быть decimal-literal,
decimal-literal:
ненулевой цифры
decimal-literal' opt цифрыздесь цифры и
[0-9]и ненулевой цифры и[1-9]и суффикс par может быть одним изu,U,l,L,llилиLL. Нигде здесь это не включает-как часть десятичного литерала.In §2.13.2, мы также имеем:
An целочисленный литерал - это последовательность цифр, которая не имеет периода или экспоненты, с необязательным разделением одинарных кавычек, которые игнорируются при определении его значения. Целочисленный литерал может иметь префикс, определяющий его основание, и суффикс, определяющий его тип. Лексически первая цифра последовательности цифр является наиболее значимой. A decimal целочисленный литерал (основание десять) начинается с цифры отличное от 0 и состоит из последовательности десятичных цифр.
(выделено мной)
что означает
-на-2147483648- это унарныйoperator -. Это значит-2147483648на самом деле рассматриваться как-1 * (2147483648). Так как2147483648- это слишком много для вашегоintон повышен доlong intи двусмысленность исходит из того, что не соответствует.если вы хотите получить минимальное или максимальное значение для типа переносимым способом вы можете использовать:
std::numeric_limits<type>::min(); // or max()
выражение
-2147483648на самом деле применение-оператор на постоянный2147483648. На вашей платформе,intне могу в магазине2147483648, он должен быть представлен большего типа. Поэтому выражение-2147483648не выводится бытьsigned intно более крупный подписанный тип, вероятноsigned long int.так как вы не предоставляете перегрузку для
longкомпилятор вынужден выбирать между двумя перегрузками, которые являются одинаково допустимыми (in). Ваш компилятор должен выпустить компилятор ошибка о неоднозначных перегрузках.
расширение на ответы других
чтобы прояснить, почему ОП путается, сначала: считать
signed intдвоичное представление2147483647ниже.
Далее, добавьте к этому числу: даю еще одинsigned intна-2147483648(который ОП желает использовать)![]()
и наконец: мы можем видеть, почему OP путается, когда-2147483648компилируется вlong intвместоsigned int, Так как он четко вписывается в 32 бит.но, как упоминают текущие ответы, унарный оператор (
-) применяется после разрешение2147483648что этоlong intи не вписывается в 32 бита.

