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

Már*_*ldi 11 c++ c++11 list-initialization

列表初始化({...}语法)不允许缩小转换.例如,尝试列表初始化一个int iwith会3.14f产生编译错误,因为从浮点值到整数的转换正在缩小:

<source>:11:32: error: narrowing conversion of '3.1400001e+0f' from 'float' to 'int' inside { } [-Wnarrowing]
     int i{3.14f};
                ^
Run Code Online (Sandbox Code Playgroud)

随着中说,为什么它可以构造一个float f3.14,这是类型的double?(从转换doublefloat被认为是缩小的.)执行以下操作:

float f{3.14};
Run Code Online (Sandbox Code Playgroud)

不保留编译错误.

GMa*_*ckG 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是常量表达式和转换后的实际值在可以表示的值范围内(即使它不能准确表示),

  • 使用int值初始化char时也是如此. (2认同)