[dcl.init.list]/§7(标准草案):
窄化转换是一种隐式转换
...
- 从 long double 到 double 或 float,或从 double 到 float,但当源是一个常量表达式且实际值在可表示的值范围内(即使不能完全表示)时,不属于窄化转换,或者
...
表达式 3.14159
和 double(3.141)
都是常量表达式,且其值在可以被 float
表示的范围内。因此,根据标准所定义的窄化转换,这种转换不属于窄化,也就没有必要对其进行警告。
但是长输入的情况下也没有警告
确实会有警告,只要该值超出了 float
可表示的范围。
double
变量(即非常量表达式)或具有大值的常量一起使用,将生成诊断消息。 例如:double d = 3.14159;
float a {d}; // non-constant-expression cannot be narrowed from type 'double' to 'float' in initializer list
编辑(适用于较长的输入)
因为即使float
不能精确表示该值,也不会发生溢出,因此是允许的。
$8.6.4/7.2 List-initialization(强调我的)
从长双精度转换为双精度或浮点数,或从双精度转换为浮点数,除非源是常量表达式并且转换后的实际值在可以表示的值范围内(即使不能精确表示),或者