Почему компилятор принимает инициализацию числа с длинным двойным литералом? - PullRequest
0 голосов
/ 09 сентября 2018

Мне интересно, почему компилятор не допускает инициализации с плавающей точкой const long double, но допускает инициализацию с длинным двойным литералом? Разве мы не теряем точность в первом?

float f {3.14L}; //compiles


const long double myConst {3.14};
float f{myConst}; // error: non-constant-expression cannot be narrowed from type 'long double' to 'float' in initializer list

1 Ответ

0 голосов
/ 10 сентября 2018

Потому что во втором примере у вас нет постоянного выражения. Компилятор говорит вам, что он не допускает такого преобразования в неконстантном выражении.

Следующие работы:

constexpr const long double myConst{ 3.14 };
float f{ myConst };

Кстати, кажется, вы используете clang. gcc компилирует оба ваших примера, но с предупреждением во втором случае, в то время как MSVC ++ вызывает ошибку во всех случаях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...