2013-05-14 12 views
6

ich in Schwierigkeiten geraten, während eine Klasse mit Konstanten initialisiert:läuft in Schwierigkeiten mit constexpr

Warum die Initialisierung mit einem Zeiger auf ein Element in der gleichen Klasse Ergebnisse in einen Fehler entdeckt? Der Fehler tritt auf, ohne die Klasse "Use" zu verwenden!

class A 
{ 
    private: 
     int a; 
     const int* const aptr; 

    public: 
     constexpr A(int _a): 
      a(_a) 
      , aptr(&a)   // why aptr could not be initialized? 
    {} 
}; 

class Data { } d1; 

class B 
{ 
    private: 
     Data* dptr1; 

    public: 
     constexpr B(Data* _p): dptr1(_p) {} 

}; 

class Use 
{ 
    static constexpr A a{2}; // fail! error: field initializer is not constant 
    static constexpr B b{&d1}; // works 
}; 
+0

@Morwenn: Zu dem Zeitpunkt, an dem 'aptr 'konstruiert wird, ist' a' bereits konstruiert und hat eine gültige Adresse. – Mankarse

+0

Wenn Sie 'A' und' B' aus 'Use' mit g ++ initialisieren, erhalten Sie' sorry, unimplemented: Verwendung des Wertes des Objekts, das in einem konstanten Ausdruck konstruiert wird'. – Morwenn

+0

Ich denke, Sie haben entweder einen Tippfehler oder UB: Sie nehmen die Adresse eines Funktionsparameters, der nicht mehr existiert, nachdem der Cort von 'A' beendet ist. Vielleicht willst du 'constexpr A (int & _a)'? – dyp

Antwort

3

Der Code ist gültig und Clang akzeptiert; Dies scheint ein g ++ Bug zu sein. Die Adresse Use::a.a ist ein Adreßkonstantenausdruck, da sie die Adresse eines Objekts mit statischer Speicherdauer auswertet, so daß damit ein constexpr Objekt initialisiert werden kann.

+0

Ich denke du meinst gcc.gnu.org/PR57694 –

+0

Sorry, du hast Recht. Der Fehlerbericht ist http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57694 – Klaus