2016-06-02 9 views
1

Dies ist mein Code:Warnung in der Liste der Initialisierung in C++ 11

int x=65; 
char ch{x}; 

Und dies ist die Warnung beim Kompilieren mit `-std = C++ 11-Flag:

Narrowed conversion from "int to char" 

Aber Ich denke, es sollte ein Fehler sein, da x keine Konstante ist und wir initialisieren ch with a non-constant value. Was passiert eigentlich?

+0

Warum sollten/können Sie 'ch' nicht mit einer Variablen initialisieren? –

+1

@MagnusHoff C++ 11 verbietet es, Konvertierungen in '{}' einzuschränken. – hvd

Antwort

0

Klirren geben Ihnen einen Fehler:

main.cpp:23:9: error: non-constant-expression cannot be narrowed from type 'int' to 'char' in initializer list [-Wc++11-narrowing] 

gcc soweit ich beschlossen erinnere Verwarnung zu erteilen, da es zu viele ist Quellcode, der durch eine solche Entscheidung gebrochen werden würde.

Wenn Sie die Variable mithilfe der einheitlichen Initialisierung initialisieren, ist das Einschränken von Konvertierungen verboten.

+0

Das heißt, wenn x ein const war, dann ist es immer noch ein Fehler/wa für die Verengung der Konvertierung? –

+1

@dlpcoder ja, aber nur wenn der Wert im Bereich des Variablentyps liegt, der initialisiert wird. Zum Beispiel 'const int x = 65;' wird OK sein, aber 'const int x = 65000;' erzeugt einen Fehler. Wenn die Variable ein konstanter Ausdruck ist, wird der Wertebereich zur Kompilierungszeit überprüft. Ich weiß nicht, wo das im Standard erklärt wird, aber hier wird eher "constexpr" benötigt, zum Beispiel "void foo (const int n) {char ch {n}; } 'wird auch fehlschlagen, obwohl 'n' const ist. – marcinj

+0

Denn im letzten Fall weiß der Compiler nichts über den Wert von n, der übergeben wird. Es mag eine engere Konvertierung sein. Daher wird es scheitern. –

1

Sie haben Recht, dass der Standard dies als Fehler behandelt und es Implementierungen ermöglicht, diesen Code abzulehnen.

Implementierungen sind jedoch fast nie erforderlich, um Code zurückzuweisen, der nicht dem Standard entspricht. Sie müssen das Problem diagnostizieren, aber wenn sie das Etikett "Warnung" anhängen und weiterhin den Code akzeptieren, gibt es kein Problem.

In diesem Fall, C++ 11 gemacht perfekt C++ 03 Code in einen Fehler (nicht ganz Ihr Code, aber char ch[] = {x}; verwendet, um gültig zu sein), so Compiler haben einen guten Grund, es als nur zu behandeln eine Warnung: Sie wollen so viel früher gültigen Code als sinnvoll akzeptieren, oder Benutzer haben einen guten Grund, zu einem anderen Compiler zu wechseln.

Verwandte Themen