为什么编译器接受带有长双精度字面量的浮点数的初始化?

时间:2018-09-09 15:37:08

标签: c++ c++11

我想知道为什么编译器不容许将const long double的float初始化,而是允许使用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 :(得分:3)

因为在第二个示例中,您没有常量表达式。编译器告诉您,它不允许在非常量表达式中进行此类转换。

以下作品:

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

在旁注中,似乎您正在使用clang。 gcc会编译您的两个示例,但在第二种情况下会发出警告,而MSVC ++在所有情况下都会引发错误。