2015-03-26 9 views
7

निम्न कोड को संकलित करता है और रन जीसीसी 4.9.1 और बजना-3.6 में जब -std = C++ 11 का उपयोग:प्रारंभ 4.8

struct Bar 
{ 
    int x; 
}; 

struct Foo 
{ 
    static constexpr Bar bars[] = {1, 2, 3}; 
}; 

constexpr Bar Foo::bars[]; 

हालांकि, यह जीसीसी में विफल रहता है 4.8.3, त्रुटि संदेश में जिसके परिणामस्वरूप

./cpptest.cpp:14:43: error: could not convert '1' from 'int' to 'const Bar' 
    static constexpr Bar bars[] = {1, 2, 3}; 
             ^
./cpptest.cpp:14:43: error: could not convert '2' from 'int' to 'const Bar' 
./cpptest.cpp:14:43: error: could not convert '3' from 'int' to 'const Bar' 

संयोग से, अगर मैं एक ही बात है, लेकिन bars एक स्थिर स्थिरांक वैश्विक सरणी बनाने के लिए, यह जीसीसी 4.8 और बजना में ठीक संकलित करता है। अगर मैं {} की एक अतिरिक्त जोड़ी के साथ सूची में प्रत्येक पूर्णांक अक्षर को घेरता हूं तो यह ठीक से संकलित होगा।

तो क्या यह gcc 4.8 में एक बग है? मानक कहता है कि इसके लिए उचित वाक्यविन्यास क्या है? जब मैं अतिरिक्त ब्रेसिज़ को छोड़ देता हूं तो सी ++ 11 वर्दी प्रारंभिक मानक का किस भाग का आह्वान किया जा रहा है?

संपादित करें: ऐसा लगता है कि मानक की तरह का कहना है कि इस कुल प्रारंभ है, जो "ब्रेस इलिजन" के लिए अनुमति चाहिए आह्वान करना चाहिए। तो ऐसा लगता है कि यह जीसीसी 4.8 में एक बग है, जिसे जीसीसी 4.9 द्वारा तय किया गया था, लेकिन मुझे मानक के पढ़ने में पूरी तरह से विश्वास नहीं है। मुझे इसके बारे में जीसीसी के बग ट्रैकर में कोई भी बग रिपोर्ट नहीं मिल रही है, इसलिए मैं आसानी से गलत हो सकता था।

+0

क्या आपने इसे एक बग माना था जिसे तय किया गया था? – edmz

उत्तर

2

आपको फू के अंदर एक constexpr निर्माता द्वारा निर्दिष्ट की जरूरत है कि आप क्या करना चाहते करने के लिए, में:

struct Bar 
{ 
    constexpr Bar(int c) : x(c) 
    {} 

    int x; 
}; 

struct Foo 
{ 
    static constexpr Bar bars[] = {1, 2, 3}; 
}; 

constexpr Bar Foo::bars[]; 

जाहिर जीसीसी 4.8.3 कर्ली कोष्ठक के अंदर मान परिवर्तित वस्तुओं बार करने के लिए implicity नहीं करता है, जबकि जीसीसी 4.9.1 करता है।

+0

निश्चित रूप से, और यही वह मार्ग है जिसे मैं नीचे जा रहा हूं। यह जीसीसी 4.9 में एक और बग उजागर कर रहा है (जो मैंने यहां बताया है: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65695)। लेकिन मेरा सवाल यह है कि क्या मानक उन ब्रेसिज़ के बिना प्रारंभिक अनुमति दे सकता है? और मुझे लगता है कि जवाब हां है, यह केवल जीसीसी के कॉन्सएक्स सदस्यों के साथ ब्रेस एलिशन के हैंडलिंग में एक बग है। –

+0

मैं इसे एक बग नहीं कहूंगा। जब आप एक कॉन्सएक्सप्रैर वैरिएबल घोषित करते हैं तो जीसीसी बस आपको एक कॉन्स्टेक्सर कन्स्ट्रक्टर घोषित करने की मांग करता है। मैंने आपकी बग रिपोर्ट भी देखी और उसे जवाब दिया। आप जो करना चाहते हैं वहां काम नहीं करना चाहिए: आपको स्थैतिक चर में एक गैर स्थैतिक सदस्य फ़ंक्शन का पता संग्रहीत करने में सक्षम नहीं होना चाहिए। – kamshi

+0

जीसीसी 4.8 आईएसओ/आईईसी 14882: 2011 (सी ++ 11) मानक का समर्थन करने का दावा करता है। यदि ब्रेस एलिशन मानक की उल्लंघन करने में विफलता (और मुझे यकीन है कि यह करता है), तो यह जीसीसी 4.8 में एक बग है। और, इसी प्रकार, मानक निरंतर अभिव्यक्तियों पर एक अनुभाग है। यह उन चीजों की एक लंबी सूची देता है जो निरंतर अभिव्यक्ति नहीं हैं। मानक (स्वीकार्य रूप से शौकिया) मानक के आधार पर, एक गैर स्थैतिक सदस्य समारोह का पता निरंतर अभिव्यक्ति है। –

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