float Initialisierung von double mit geschweiften Klammern

8

Warum warnt der Compiler (clang, gcc) nicht davor, Conversions zu verringern?

%Vor%

Ich habe eine Warnung erwartet, weil ich explizite Wert-Initialisierung mit geschweiften Klammern mache. Nach dieser Antwort Link sollte ein Fehler ausgegeben werden.

Zusammenstellung hier

    
Gabriel 25.11.2016, 13:10
quelle

2 Antworten

15

[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. .

    
user2079303 25.11.2016, 13:16
quelle
10

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.

%Vor%

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

    
songyuanyao 25.11.2016 13:15
quelle