2013-05-14 24 views
6

biegnę w kłopoty podczas inicjalizacji klasy ze stałych:uruchomiony w kłopoty z constexpr

Dlaczego inicjalizacji z wskaźnik do członka w tych samych wyników klasę na błąd? Błąd pojawia się bez użycia klasy "Użyj"!

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: Do czasu budowania 'aptr'' a' został już skonstruowany i ma poprawny adres. – Mankarse

+0

Inicjalizuję 'A' i' B' poza 'Use' z g ++, otrzymujesz' sorry, unimplemented: użycie wartości konstruowanego obiektu w stałym wyrażeniu'. – Morwenn

+0

Myślę, że albo masz tu literówkę, albo UB: Podajesz adres parametru funkcji, który już nie istnieje po zakończeniu ctorka "A". Może chcesz "constexpr A (int & _a)"? – dyp

Odpowiedz

3

Kod jest ważny, a Clang to akceptuje; to wydaje się być błędem g ++. Adres Use::a.a jest wyrażeniem stałym adresu, ponieważ jest to adres obiektu o statycznym czasie przechowywania, więc można go użyć do zainicjowania obiektu constexpr.

+0

Myślę, że masz na myśli gcc.gnu.org/PR57694 –

+0

Przepraszam, masz rację. Raport o błędzie: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57694 – Klaus