c++ - 为什么编译器接受带有 long double 文字的 float 的初始化?

标签 c++ c++11

我想知道为什么编译器不允许将 float 初始化为 const long double 但允许使用 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

最佳答案

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

以下作品:

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

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

关于c++ - 为什么编译器接受带有 long double 文字的 float 的初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52246057/

相关文章:

c++ - 多次优化递归双链表删除节点

c++ - 重定向 PostgreSQL Qt 驱动程序标准输出/标准错误输出

c++ - 使用可变参数模板函数计算多个值的平均值

c++ - 在可移动和不可复制的类上使用移动和交换习语是否有意义

C++:如何将 ASCII 或 ANSI 转换为 UTF8 并存储在 std::string 中

c++ - C++中的字符串处理和内存管理

c++ - 如何从 GCC 中的 C/C++ 源代码获取汇编程序输出?

c++ - std::map 和 std::set 不返回带提示的 bool

c++ - 调整大小时,std::vector是否会复制/move 元素?

c++ - C++11 是否允许非匿名 union 包含静态数据成员?