2013-05-14 14 views
6

başı derde giriyor:sabitleri sahip bir sınıf başlatılırken ben derde constexpr

Neden bir hata içine aynı sınıf sonuçlarında bir üyesine bir işaretçi ile başlatma? Hata "Kullanım" sınıfını kullanmadan gelir!

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: "Uygun" oluşturulduğunda, "a" zaten kurulmuş ve geçerli bir adrese sahip. – Mankarse

+0

"A" ve "B" yi "++" ile "out" işlevini baştan başlatabilirim, "Üzgünüz, hiç kullanılmamış": sabit bir ifadeyle oluşturulmuş nesnenin değerinin kullanılması. – Morwenn

+0

Sanırım burada bir yazım hatası ya da UB var: Bir fonksiyon parametresinin adresini alıyorsunuz, artık “A” nın bitişi bittikten sonra mevcut değil. Belki de constexpr A (int & _a) 'istiyorsun? – dyp

cevap

3

Bu kod geçerlidir ve Clang bunu kabul eder; Bu g ++ bir hata gibi görünüyor. Use::a.a adresi, bir adres sabit ifadesidir, çünkü statik depolama süresi olan bir nesnenin adresini değerlendirir, böylece bir constexpr nesnesini başlatmak için kullanılabilir.

+0

Bence gcc.gnu.org/PR57694 –

+0

Üzgünüz, haklısın. Hata raporu http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57694 – Klaus

İlgili konular