[dcl.init.list] / §7 (Standardentwurf)
Eine einschränkende Konvertierung ist eine implizite Konvertierung
...
- von long double zu double oder float oder von double zu float , außer wenn die Quelle ein konstanter Ausdruck ist und der tatsächliche Wert nach der Konvertierung innerhalb des Wertebereichs liegt, der dargestellt werden kann (auch wenn dies nicht möglich ist) genau dargestellt) oder
...
Beide Ausdrücke 3.14159
und double(3.141)
sind konstante Ausdrücke und der Wert liegt innerhalb des Wertebereichs, der durch float
dargestellt werden kann. Daher wird die Konvertierung nicht eingeschränkt , wie vom Standard definiert, und es besteht keine Notwendigkeit, vor der Konvertierung zu warnen.
aber es gibt auch keine Warnung für längere Eingaben
Natürlich , solange der Wert außerhalb des Wertebereichs liegt, der durch float
dargestellt werden kann. .
Da die Quelle ein konstanter Ausdruck ist und in diesen Fällen kein Überlauf auftritt, die Konvertierung einschränken Fehler wird nicht ausgelöst.
(Betonung meiner)
Konvertierung von einem langen double in double oder float und conversion von double in float, mit der Ausnahme, dass die Quelle ein konstanter Ausdruck ist und kein Überlauf auftritt
Wenn Sie es mit einer double
-Variable (d. h. einem nicht konstanten Ausdruck) oder einer Konstanten mit einem großen Wert, der zu einem Überlauf führt, verwenden, wird die Diagnosemeldung generiert. z.B.
BEARBEITEN (für längere Eingabe)
Weil, selbst wenn der Wert nicht genau durch float
dargestellt werden kann, ein Überlauf immer noch nicht auftritt, dann ist es erlaubt.
$ 8.6.4 / 7.2 Listeninitialisierung (Betonung meiner)
von long double zu double oder float oder double zu float, außer wenn die Quelle ein konstanter Ausdruck ist und der tatsächliche Wert nach der Konvertierung innerhalb des Wertebereichs liegt, der dargestellt werden kann (), auch wenn dies nicht möglich ist genau dargestellt ) oder
Tags und Links c++ c++11 c++14 brace-initialization value-initialization