Eingeschränkte Konvertierung von 'int' (konstanter Ausdruck) zu 'unsigned int' - MSVC vs gcc vs clang

9
%Vor%

Das obige Snippet:

  • Kompiliert ohne Warnungen in g++ 7 mit -Wall -Wextra -Wpedantic .

  • Kompiliert ohne Warnungen in clang++ 4 mit -Wall -Wextra -Wpedantic .

  • Kompiliert nicht auf MSVC 2017 :

      

    Konvertierung von 'const int' zu 'unsigned int' erfordert eine einschränkende Konvertierung

F: ist MSVC falsch?

Live-Beispiel auf godbolt.org

%Vor%
  • Kompiliert mit Warnungen in g++ 7 mit -Wall -Wextra -Wpedantic :

      

    Einschränkung der Umwandlung von 'i' von 'int' nach 'unsigned int'

  • Fehler beim Kompilieren von clang++ 4 mit -Wall -Wextra -Wpedantic :

      

    non-constant-expression kann nicht vom Typ 'int' auf 'unsigned int' in der Initialisierungsliste

    eingeschränkt werden
  • Kompiliert nicht auf MSVC 2017 :

      

    Konvertierung von 'const int' zu 'unsigned int' erfordert eine einschränkende Konvertierung

F: Ist g ++ hier falsch? (d. h. sollte es einen schweren Fehler erzeugen?)

Live-Beispiel auf godbolt.org

    
Vittorio Romeo 28.03.2017, 17:28
quelle

1 Antwort

4

Es gibt niemals eine Anforderung, dass irgendein C ++ Programm einen harten Fehler erzeugt. Es gibt Anforderungen zum Drucken von Diagnosen. Die Form der Diagnose ist durch den Standard nicht spezifiziert: Ein alter Witz ist, dass das Ausdrucken eines einzelnen Platzes die diagnostischen Anforderungen des Standards erfüllt. Das wäre ein Qualitätsproblem bei der Implementierung.

Es gibt schlecht geformte Programme, bei denen der Standard keine Einschränkungen für ihr Verhalten und manchmal eine obligatorische Diagnose festlegt.

Es gibt Fälle, in denen ein Programm schlecht ausgebildet ist und eine Diagnose erforderlich ist. Eine Möglichkeit, dies zu bewerkstelligen, besteht darin, eine Nachricht zu erstellen, die besagt, dass es sich um einen Fehler handelt, und dann keine Binärdatei zum Ausführen zu generieren. Eine andere Möglichkeit besteht darin, eine Nachricht zu erzeugen, die besagt, dass es sich um eine Warnung handelt, und dann eine binäre Datei zu erzeugen, die ausgeführt werden kann.

Also, g ++ ist nicht falsch unter dem Standard für das bloße Ausdrucken einer Warnung.

Das resultierende Programm ist technisch alles undefinierte Verhalten; g ++ kann Ihre Festplatte formatieren, wenn sie ohne Verletzung des Standards läuft. Dies würde als Qualität der Implementierung angesehen werden.

Shafiks Antwort hier deckt die erste Frage ab. i ist ein konstanter Ausdruck und sein Wert entspricht dem Zieltyp. es sollte keine Warnung oder ein Fehler über die sich verengende Konvertierung geben.

Der C ++ - Standard schützt Sie nicht vor feindlichen Compilern.

Wie bereits erwähnt, kann -pedantic-errors an g ++ übergeben werden, damit es anstelle von Warnungen schwere Fehler generiert, wenn das Standardprogramm das resultierende Programm schlecht formatiert.

    
Yakk 28.03.2017, 18:01
quelle