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 double到double或float,或者从double到float,除非源是一个常量表达式与实际值后的转换是可以表示的值的范围内 (即使它不能被精确地表示),或[...]
你1.3的表达范围很长float.
我建议将此报告给Microsoft,假设它已经不是已知问题.不幸的是,只是升级Visual Studio不会解决这个问题.我可以在VS2015中重现这个问题.
小智 5
使用“f”后缀强制其为浮点型可以避免缩小转换。以下作品..
float f{1.3f}
Run Code Online (Sandbox Code Playgroud)
但我同意编译器应该处理它..(根据@hvd引用的标准)