2013-05-14 8 views
6

के साथ मुसीबत में चल रहा है मैं मुसीबत में चलाने जबकि स्थिरांक के साथ एक कक्षा आरंभ:constexpr

क्यों एक त्रुटि में एक ही कक्षा के परिणाम में एक सदस्य के लिए सूचक के साथ initialisation? त्रुटि "उपयोग" श्रेणी के बिना त्रुटि आती है!

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

@ मॉर्वेन: जब तक 'एपीआरटी' का निर्माण किया जा रहा है, तब तक 'ए 'पहले ही बनाया जा चुका है और इसका एक वैध पता है। – Mankarse

+0

मैं g ++ के साथ 'उपयोग' के 'ए' और' बी 'आउटिसडे को प्रारंभ करता हूं, आपको' क्षमा करें, अनुपूरक: निरंतर अभिव्यक्ति में बनाए जा रहे ऑब्जेक्ट के मान का उपयोग 'मिलता है। – Morwenn

+0

मुझे लगता है कि आपके पास या तो एक टाइपो या यूबी है: आप फ़ंक्शन पैरामीटर का पता ले रहे हैं, जो 'ए' के सीटीओ के समाप्त होने के बाद और मौजूद नहीं है। शायद आप 'constexpr ए (int और _a) 'चाहते हैं? – dyp

उत्तर

3

कोड मान्य है, और क्लैंग इसे स्वीकार करता है; यह एक g ++ बग प्रतीत होता है। Use::a.a का पता एक पता निरंतर अभिव्यक्ति है, क्योंकि यह स्थिर संग्रहण अवधि वाले ऑब्जेक्ट के पते पर मूल्यांकन करता है, इसलिए इसका उपयोग constexpr ऑब्जेक्ट को प्रारंभ करने के लिए किया जा सकता है।

+0

मुझे लगता है कि आपका मतलब है gcc.gnu.org/PR57694 –

+0

क्षमा करें, आप सही हैं। बग रिपोर्ट http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57694 है – Klaus

संबंधित मुद्दे