Obwohl ich in diesem Arbeitsentwurf C ++ Standard (ab 2014) nicht ausdrücklich erwähnen kann, dass die Konvertierung von einem integralen Typ verboten ist, gibt es auch keine Erwähnung, dass eine solche Konvertierung zulässig ist!std::nullptr_t
Der Fall der Umstellung von std::nullptr_t
auf bool
wird jedoch ausdrücklich erwähnt:
4.12 Boolesche Konvertierungen
Ein Wert von arithmetischer, nicht skalierter Aufzählung, Zeiger oder Zeiger auf Elementtyp kann in einen Wert vom Typ bool konvertiert werden. Ein Nullwert, ein Nullzeigerwert oder ein Nullelementzeigerwert wird in false konvertiert. Jeder andere Wert wird in true konvertiert. Für die Direktinitialisierung (8.5) kann ein Wert vom Typ std :: nullptr_t in einen Wert vom Typ bool konvertiert werden. Der resultierende Wert ist falsch.
Die einzige Stelle in diesem Dokumententwurf, an der die Konvertierung von std::nullptr_t
einem integralen Typ erwähnt wird, befindet sich im Abschnitt "reinterpret_cast":
5.2.10 Cast neu interpretieren
...
(4) Ein Zeiger kann explizit in einen beliebigen Integraltyp konvertiert werden, der groß genug ist, um ihn zu halten. Die Zuordnungsfunktion ist implementierungsdefiniert. [Hinweis: Es ist nicht überraschend für diejenigen, die die Adressierungsstruktur des zugrunde liegenden Computers kennen. - Endnote] Ein Wert vom Typ std :: nullptr_t kann in einen ganzzahligen Typ konvertiert werden. Die Konvertierung hat dieselbe Bedeutung und Gültigkeit wie eine Konvertierung von (void *) 0 in den Integraltyp. [Hinweis: Ein reinterpret_cast kann nicht verwendet werden, um einen Wert eines beliebigen Typs in den Typ std :: nullptr_t zu konvertieren. - Endnote]
Aus diesen beiden Beobachtungen könnte man (IMHO) vernünftigerweise vermuten, dass der MSVC
Compiler korrekt ist.
EDIT : Ihre Verwendung der "funktionalen Notation Cast" kann jedoch tatsächlich das Gegenteil suggerieren! Der MSVC
Compiler hat kein Problem mit der Verwendung eines C-Stils, zum Beispiel:
uintptr_t answer = (uintptr_t)(nullptr);
aber (wie in Ihrem Code) beschwert es sich darüber:
uintptr_t answer = uintptr_t(nullptr); // error C2440: '<function-style-cast>': cannot convert from 'nullptr' to 'uintptr_t'
Aus demselben Standardentwurf:
5.2.3 Explizite Typkonvertierung (funktionale Notation)
(1) Ein einfacher Typspezifizierer (7.1.6.2) oder Typennamenspezifizierer (14.6) gefolgt von einer in Klammern gesetzten Ausdrucksliste erstellt einen Wert des angegebenen Typs in der Ausdrucksliste. Wenn die Ausdrucksliste ein einzelner Ausdruck ist, entspricht der Typkonvertierungsausdruck (in seiner Definiertheit und, falls in seiner Bedeutung definiert) dem entsprechenden Besetzungsausdruck (5.4). ...
Der "entsprechende Besetzungsausdruck (5.4)" kann sich auf eine Besetzung im C-Stil beziehen.