为什么编译器接受具有long double literal的float的初始化?

Rez*_*fra 7 c++ c++11

我想知道为什么编译器不能容忍初始化浮点数一个const long double但允许使用long double literal初始化?我们不是在前者失去精确度吗?

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
Run Code Online (Sandbox Code Playgroud)

Max*_*mer 3

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

以下作品:

constexpr const long double myConst{ 3.14 };
float f{ myConst };
Run Code Online (Sandbox Code Playgroud)

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