我发现了很多关于此错误的帖子,但我可以找到如何克服它。 这是触发错误的代码:
void main(){
float f{1.3};
}
为什么在initialize-list中没有像其他变量那样发生转换?例如,这很顺利:
float f = 1.3;
答案 0 :(得分: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中重现这个问题。
答案 1 :(得分:3)
使用'f'后缀强制它浮动可以避免缩小转换。以下作品..
float f{1.3f}
但我同意编译器应该照顾它..(根据@hvd引用的标准)
答案 2 :(得分:0)
由于它是C ++,不要使用c风格的强制转换,请尝试:
static_cast<float>(std::abs(...))
答案 3 :(得分:0)
这可能是一个错误或其他什么。请改用:
float f;
f=1.3;