Почему MSVC выбирает длинный длинный тип для -2147483648?

Мой фрагмент:

auto i = -2147483648;
int j = 3;
std::swap(i, j); // Compile error about mismatched types here. 

Компилятор утверждает, что буква i является long long. Почему это? -2147483648 подходит для int на MSVC x64.

Мой компилятор - это MSVC, цель - 64 бита.

Ответ 1

Вопреки распространенному мнению, -2147483648 не буквально: С++ не поддерживает отрицательные значения литерала.

Это, по сути, постоянное выражение для оценки времени компиляции, состоящее из унарного отрицания литерала 2147483648.

В MSVC x64, который имеет 32 бит int и long s, 2147483648 слишком велик для любого из них, поэтому он не подходит к типу long long, который вы наблюдаете.