А вы попробуйте проще:
const int i = 1.22;
constexpr int n = i;
правильно, потому что правое выражение содержит целое, которое является константным выражением 1
, а для чисел с плавающей точкой не так, потому что для них проводится экспоненциальная запись(читайте как хранятся double). Вы можете написать:
const double d = 1.22 /3;
Кажется что результат должен быть константным выражением, поскольку делятся два литерала. Но это не так:
constexpr double e = d;
уже является ошибкой, потому что d
может иметь бесконечно или очень много знаков после плавающей точки, и в зависимости от показателья степени(экспоненты), может быть представлен по разному, и в итоге будет округлен, дабы вмещаться в выделенные для типа байты. Если взять 10 знаков, то это число: 40666.66667 / 10^5
или же вам может быть нужно округление до 6 знаков? Тогда это число 0.40667
и так далее. Теперь эти два числа умножте на 10^5
и получите совершенно разные целые. Надеюсь я смог объяснить почему одним словом константное целое воспринимается также как константное выражение, а константное число с плавающей точкой не считается и константным выражением. Об этом компилятору явно нужно сказать, указав явно, что это не константа а именно constexpr