列表初始化({...}
语法)不允许缩小转换次数。例如,尝试使用int i
列出初始化3.14f
会产生编译错误,因为从浮点值到整数的转换正在缩小:
<source>:11:32: error: narrowing conversion of '3.1400001e+0f' from 'float' to 'int' inside { } [-Wnarrowing]
int i{3.14f};
^
话虽如此,为什么可以构建float f
3.14
double
,其类型为double
? (从float
到float f{3.14};
的转换被视为范围缩小。)执行以下操作:
div
不存在编译错误。
答案 0 :(得分:13)
在被视为缩小转换的列表中,适合目标类型的常量表达式是一个例外。因此,虽然通常double to float正在缩小,但当你的double实际上是文字时,这是允许的。
http://coliru.stacked-crooked.com/a/6949f04fa4a8df17
从我手边的草稿(我认为接近C ++ 14):
8.5.4列表初始化
(7.2)缩小转换是隐式转换......
...从long double到double或float,或从double到float,除非source是常量 表达式和转换后的实际值在可以表示的值范围内 (即使它无法准确表示),