1

int a = 0; short b{a}; short c{0};Verschmälerung von wörtlichen verursacht keine

Der Compiler Warnung eines Waring für short b{a} gibt. Ich kann das verstehen, weil int auf short verengt ist.

Allerdings gibt es keine Warnung an short c{0}, die für mich seltsam ist. Ich erinnere mich an wörtliche Ganzzahlen, der Typ 0 sollte mindestens int sein. So kommt es hier von int zu short. Warum gibt der Compiler keine Warnung aus?

Antwort

5

Für short c{0};, narrowing conversion tritt nicht auf. Denn 0 ist ein konstanter Ausdruck und kann genau in einem short gespeichert werden.

(emphasis Mine)

list-Initialisierung erlaubte die impliziten Konvertierungen begrenzt durch das Verbot der folgende:

  • ...

  • Umwandlung von Ganzzahl oder unscoped Aufzählungstyp Integer-Typ, der nicht alle Werte des Originals darstellen kann, , außer wo Quelle ein konstanter Ausdruck ist, dessen Wert genau in gespeichert werden kann der Zieltyp

gehörigen Erläuterungen und Beispielen aus dem Standard, $8.6.4/7 List-initialization [dcl.init.list]:

(emphasis Mine)

Verengung Umwandlung ist eine implizite Umwandlung

  • ...

  • aus einem Integer-Typ oder unscoped Aufzählungstyp zu einem Integer-Typ, die nicht alle Werte der Vorlagenart darstellen, außer wo die Quelle ein konstanter Ausdruck, dessen Wert nach der integralen aktionen wird, wird das Zieltyp passen in.

[Anmerkung: Wie bereits erwähnt, sind solche Umwandlungen an der obersten Ebene in list-Initialisierungen nicht erlaubt. - Endnote] [Beispiel:

// ... 
const int z = 99; 
// ... 
char c4{z};    // OK: no narrowing needed 
unsigned char uc1 = {5}; // OK: no narrowing needed 
// ... 
float f2 { 7 };   // OK: 7 can be exactly represented as a float 
// ... 

- Ende Beispiel]

+0

denken Sie, die "nach integrales Promoten" unecessary? – FunkyBaby

+0

@FunkyBaby Ich denke, es bedeutet nur technisch, die Konstante würde zuerst ganz integriert werden, dann wird der hochgestufte Wert überprüft, ob er in den Zieltyp passen könnte. – songyuanyao

Verwandte Themen