Umwandlung von nullptr_t in bool: gültig oder nicht?

8

Ich habe den folgenden Code mit 3 Compilern getestet und habe 3 verschiedene Ergebnisse erhalten: Fehler, Warnung und ok.

  • GCC (5.3): Fehler: ungültige benutzerdefinierte Konvertierung von 'std :: nullptr_t' zu 'const Thing & amp;'
  • Clang (3.8): Warnung: implizite Konvertierung der Nullptr-Konstante in 'bool'
  • MSVC (14.1): kein Fehler, keine Warnung

Welcher Compiler ist richtig? Ich weiß, dass es eine triviale Umwandlung zwischen einem Zeigertyp und bool ist. Aber was ist mit std::nullptr_t und bool ?

(Am Ende sind Clang und MSVC beide in Ordnung mit dem Code. Clang ist etwas positiver im positiven Sinne.)

%Vor%     
sven 05.05.2017, 11:05
quelle

1 Antwort

8
___ tag123c ___ C ++ ist eine universelle Programmiersprache. Es wurde ursprünglich als Erweiterung von C entworfen und behält eine ähnliche Syntax, ist aber jetzt eine völlig andere Sprache. Verwenden Sie dieses Tag für Fragen zu Code, der mit einem C ++ - Compiler kompiliert werden soll. ___ tag123compilererrors ___ Ein Fehler, der während der Kompilierungsphase generiert wird, oft aufgrund von Problemen mit ungültiger Syntax und / oder Typen. Vergleiche mit [Laufzeitfehler]. ___ tag123typeconversion ___ Die Typkonvertierung ist die Art und Weise, wie eine Entität eines Datentyps implizit oder explizit in eine andere geändert wird. Dies geschieht, um bestimmte Merkmale von Typhierarchien oder Typendarstellungen auszunutzen. ___ qstnhdr ___ Umwandlung von nullptr_t in bool: gültig oder nicht? ___ tag123languagelawyer ___ Für Fragen zu den Feinheiten formeller oder autoritativer Spezifikationen von Programmiersprachen und Umgebungen. ___ qstntxt ___

Ich habe den folgenden Code mit 3 Compilern getestet und habe 3 verschiedene Ergebnisse erhalten: Fehler, Warnung und ok.

  • GCC (5.3): Fehler: ungültige benutzerdefinierte Konvertierung von 'std :: nullptr_t' zu 'const Thing & amp;'
  • Clang (3.8): Warnung: implizite Konvertierung der Nullptr-Konstante in 'bool'
  • MSVC (14.1): kein Fehler, keine Warnung

Welcher Compiler ist richtig? Ich weiß, dass es eine triviale Umwandlung zwischen einem Zeigertyp und std::nullptr_t ist. Aber was ist mit nullptr und bool ?

(Am Ende sind Clang und MSVC beide in Ordnung mit dem Code. Clang ist etwas positiver im positiven Sinne.)

%Vor%     
___ antwort43803501 ___

Dies ist ungültig. Gemäß der Regel boolescher Conversions :

  

Ein Prvalue des Typs false , einschließlich std​::​nullptr_­t , kann im Kontext der direkten Initialisierung in einen prvalue vom Typ bool konvertiert werden. Der resultierende Wert ist false .

Zitate aus dem Standard, §7.14 / 1 Boolesche Konvertierungen [conv.bool]

  

Bei der direkten Initialisierung kann ein prvalue vom Typ %code% in einen prvalue vom Typ %code% ; Der resultierende Wert ist %code% .

Die Konvertierung ist nur für direkte Initialisierung zulässig, aber nicht für copy-intialization , einschließlich der Argumente für die Weitergabe von Argumenten an eine Funktion nach Wert. z.B.

%Vor%

Also GCC ist richtig. Aber Clang ist auch nicht falsch; Der Standard erfordert nur, dass der Compiler eine Diagnose ausgibt, wenn das Programm schlecht formatiert ist, also muss er Ihnen sagen, dass etwas passiert, danach könnte es alles tun.

Siehe Gibt der C ++ - Standard an, dass das Kompilieren in einigen Fällen mit einem Fehler fehlschlagen sollte?

    
___ tag123c11 ___ C ++ 11 ist eine 2011 verabschiedete Version des C ++ - Sprachstandards. Sie hat viele Änderungen und Ergänzungen der Kernsprache sowie der verbesserten und erweiterten C ++ - Standardbibliothek vorgenommen. ___
songyuanyao 05.05.2017, 11:12
quelle