2013-05-14 48 views
6

麻煩我遇到了麻煩,同時初始化與常量類:運行與constexpr

爲什麼用指針成員在同一類結果爲錯誤的初始化? 沒有使用「使用」類的錯誤出現!

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:在構建'aptr'時,'a'已經構建並且具有有效地址。 – Mankarse 2013-05-14 09:36:04

+0

我使用g ++初始化''Use'的'A'和'B' outisde,你會得到'抱歉,未實現:使用常量表達式中構造的對象的值'。 – Morwenn 2013-05-14 09:45:31

+0

我認爲你在這裏有一個錯字或UB:你正在取一個函數參數的地址,在'A'的Ctor結束後不再存在。也許你想'constexpr A(int&_a)'? – dyp 2013-05-14 11:09:43

回答

3

該代碼是有效的,並且Clang接受它;這似乎是一個g ++的錯誤。 Use::a.a的地址是一個地址常量表達式,因爲它計算的是具有靜態存儲持續時間的對象的地址,所以它可以用來初始化一個constexpr對象。

+0

我認爲你的意思是gcc.gnu.org/PR57694 – 2013-06-30 20:10:38

+0

對不起,你是對的。錯誤報告是http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57694 – Klaus 2013-07-03 12:58:34