2014-10-04 26 views
5

के संदर्भ को आरंभ करने के लिए ब्रेस-इनिट का उपयोग करके मैं हाल ही में एक कोड पर काम कर रहा था और मैंने जीसीसी और क्लैंग में असामान्य कुछ पर ठोकर खाई। ब्रेस-इनिट का उपयोग जीसीसी में संकलन त्रुटि को ट्रिगर करता है, जबकि सीधी प्रारंभिकरण जैसे कि &b = a काम करता है। नीचे दिए गए कोड है कि व्यवहार मैं का सामना करना पड़ा की एक बहुत ही सरल उदाहरण है और मैं सोच रहा था क्यों जीसीसी कोड संकलन नहीं करता है, shared_ptr में से कोई भी एक initializer_list लेता है और a एक lvaluestd :: shared_ptr

#include <iostream> 
#include <memory> 

int main() 
{ 
    std::shared_ptr<int> a { nullptr }, &b { a }; 

    a = std::make_shared<int> (1e3); 
    std::cout << (b ? *b : 0) << std::endl; 

    return 0; 
} 

बजना 3.4 इस संकलित है के बाद से, लेकिन जीसीसी 4.8 नहीं है।

+0

जीसीसी 4.9 के लिए पुन: पेश नहीं किया जा सकता: एक तरीके का उपयोग करने के लिए direct initializationlist initialization के बिना है। शायद संस्करणों के बीच तय किया गया है। –

+0

सूची-प्रारंभ में एक दोष हो सकता है। N3337 बनाम N3485 की तुलना करें। मैं दोष रिपोर्ट खोजने की कोशिश करूंगा। – dyp

+3

यहां यह है: http://open-std.org/JTC1/SC22/WG21/docs/cwg_defects.html#1288 – dyp

उत्तर

3

CWG Defect 1288 जैसा कि @Dyp द्वारा इंगित किया गया है और GCC 4.9.0 के लिए तय किया गया है।

// Note the parentheses 
std::shared_ptr<int> a { nullptr }, &b (a); 
संबंधित मुद्दे