为什么列表初始化允许从double转换为float值?

时间:2018-01-07 20:20:59

标签: c++ c++11 list-initialization

列表初始化({...}语法)不允许缩小转换次数。例如,尝试使用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? (从floatfloat f{3.14}; 的转换被视为范围缩小。)执行以下操作:

div

不存在编译错误。

1 个答案:

答案 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是常量   表达式和转换后的实际值在可以表示的值范围内   (即使它无法准确表示),