Da die Quelle ist ein konstanter Ausdruck und Überlauf für diese Fälle nicht auftritt, dann narrowing conversion Fehler nicht ausgelöst werden.
(emphasis Mine)
Umwandlung von einer langen Doppel von Doppel zu verdoppeln oder zu schweben und die Umwandlung zu schweben, außer wenn die Quelle ein konstanter Ausdruck ist, und Überlauf nicht auftritt
Wenn Sie es mit einer double
Variablen (dh einem nicht konstanten Ausdruck) oder einer Konstanten mit einem großen Wert verwenden, der zu einem Überlauf führt, wird die Diagnosemeldung generiert. z.B.
double d = 3.14159;
float a {d}; // non-constant-expression cannot be narrowed from type 'double' to 'float' in initializer list
EDIT (für längeren Eingang)
Denn auch wenn der Wert nicht genau durch float
dargestellt werden, Überlauf immer noch nicht auftreten, dann ist es erlaubt.
$8.6.4/7.2 List-initialization (emphasie Mine)
von long double zu verdoppeln oder zu schweben, oder von doppelt zu schweben, mit der Ausnahme, wo die Quelle ein konstanter Ausdruck ist, und der Ist-Wert nach der Umwandlung innerhalb des Bereichs von Werten ist das kann dargestellt werden (auch wenn sie nicht genau dargestellt werden kann) oder
afaik, es warnt Sie nicht, wenn ein bestimmter Literalwert in einem schmaleren Typ ohne Präzisionsverlust dargestellt werden kann –
Dies kompiliert nicht auf VS2015 (Fehler 2397) – Fefux