Betrachten Sie das folgende C ++ 11-Programm und sein Ergebnis in GCC 4.7.2:
%Vor%Gemäß dem Standard:
ausgewertet wird
[C++11: 4.10/1]:
A Nullzeigerkonstante ist ein ganzzahliger konstanter Ausdruck (5.19) prvalue des Integer-Typs, der zu Null [..]
5.19 ist ein Durcheinander und ich konnte es nicht vollständig analysieren, aber erwarten wir nicht, dass i
dieses Kriterium erfüllt und als Nullzeigerkonstante agiert und folglich keine explizite Konvertierung erfordert zu int*
für die Initialisierung von p
?
Die Kompilierung ist erfolgreich, wenn ich s/constexpr/const/
und kompiliere mit -ansi
und nicht mit -std=c++11
.
[C++11: 5.19/3]:
Ein Literalkonstantenausdruck ist ein Prvalue-Kernkonstantenausdruck des Literaltyps, aber nicht des Zeigertyps. Ein Integralkonstantenausdruck ist ein Literalkonstantenausdruck des Integral- oder Unscoped-Aufzählungstyps. [..]
Und:
[C++11: 3.9/10]:
Ein Typ ist ein literaler Typ , wenn er ist:
- Skalartyp ; oder
- ein Referenztyp; oder
- ein Klassentyp (Klausel 9) mit allen folgenden Eigenschaften: [..]
- ein Array von Literaltyp.
An diesem Punkt kann ich keinen Grund finden, dass dieser Code nicht konform ist, also vermute ich einen GCC-Fehler.
Es könnte jedoch ein absichtlicher Fehler sein, wenn man annimmt, dass die von 4.10 zitierte Stelle geändert wird ( aktives Problem # 903 ), so dass dies tatsächlich nicht-konformer Code wäre.
Die Kompilierung ist erfolgreich, wenn ich
s/constexpr/const/
und kompiliere mit-ansi
und nicht mit-std=c++11
.
Die Definition von Integralkonstantenausdruck erlaubte diesen Fall explizit in C ++ 03:
[C++03: 5.19/1]:
[..] Ein Integralkonstantenausdruck kann nur Literale (2.13), Enumeratoren, const-Variablen oder statische Datenelemente von Integral- oder Enumerationstypen enthalten Initialisiert mit konstanten Ausdrücken (8.5), nicht typisierten Vorlagenparametern von Integral- oder Aufzählungstypen undsizeof
-Ausdrücken. [..]