Ist diese conexpr-Ganzzahl keine Null-Zeigerkonstante?

8

Betrachten Sie das folgende C ++ 11-Programm und sein Ergebnis in GCC 4.7.2:

%Vor%

Gemäß dem Standard:

  

[C++11: 4.10/1]: A Nullzeigerkonstante ist ein ganzzahliger konstanter Ausdruck (5.19) prvalue des Integer-Typs, der zu Null [..]

ausgewertet wird

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 .

    
Lightness Races in Orbit 21.11.2012, 12:31
quelle

1 Antwort

8
  

[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 und sizeof -Ausdrücken. [..]

    
Lightness Races in Orbit 21.11.2012, 12:33
quelle

Tags und Links