错误83错误C2398:从'double'转换为'float'需要缩小转换

Hum*_*awi 9 c++ floating-point casting compiler-bug c++11

我发现了许多关于此错误的帖子,但我可以找到如何克服它.这是触发错误的代码:

void main(){
    float f{1.3};
}
Run Code Online (Sandbox Code Playgroud)

为什么在initialize-list中没有像任何其他变量那样发生转换?例如,这很顺利:

float f = 1.3;
Run Code Online (Sandbox Code Playgroud)

小智 12

您已经评论过使用1.3会给编译器带来错误.这意味着你发现了编译器错误.标准很清楚,这不是一个缩小的转换,所以应该允许它.

引用N4140(大致是C++ 14):

8.5.4列表初始化[dcl.init.list]

7.一种收缩转换是隐式转换

[...]

- (7.2)从long doubledoublefloat,或者从doublefloat,除非源是一个常量表达式与实际值后的转换是可以表示的值的范围内 (即使它不能被精确地表示),或

[...]

1.3的表达范围很长float.

我建议将此报告给Microsoft,假设它已经不是已知问题.不幸的是,只是升级Visual Studio不会解决这个问题.我可以在VS2015中重现这个问题.

  • @HumamHelfawi 是的,Visual Studio 的编译器似乎会检查该值是否可以准确地用“float”表示。`1.5` 可以,因为它的二进制表示(`1.1`)只需要固定的两位数。`1.3` 不可能,因为它是二进制的重复小数,它在 `double` 的最大精度处被截断,该精度高于 `float` 的最大精度,因此从概念上讲需要从 `double` 进行舍入` 为 `浮动`。但这并不是标准所说的应该如何运作。 (2认同)

小智 5

使用“f”后缀强制其为浮点型可以避免缩小转换。以下作品..

float f{1.3f}
Run Code Online (Sandbox Code Playgroud)

但我同意编译器应该处理它..(根据@hvd引用的标准)