13

Clang documentation बड़े करीने से बताते हैं कि एक वर्ग या struct कोई उपयोगकर्ता-निर्धारित डिफ़ॉल्ट निर्माता हैउपयोगकर्ता द्वारा घोषित डिफ़ॉल्ट कन्स्ट्रक्टर + इन-क्लास प्रारंभकर्ता! = उपयोगकर्ता द्वारा प्रदत्त कन्स्ट्रक्टर?

हैं, सी ++ आप डिफ़ॉल्ट इस ([dcl.init] की तरह इसके बारे में एक स्थिरांक उदाहरण निर्माण की अनुमति नहीं है , पी 9)

तर्क यह है कि यदि कोई कॉन्स्ट ऑब्जेक्ट सही ढंग से प्रारंभ नहीं किया गया है, तो इसे बाद में बदला नहीं जा सकता है। निम्नलिखित कोड का उपयोग केवल एक उपयोगकर्ता- घोषित Test के लिए डिफ़ॉल्ट निर्माता हैं, लेकिन इसकी सभी सदस्यों में स्तरीय initializers है,

#include<iostream> 

class Test 
{ 
public: 
    Test() = default; 
    void print() const { std::cout << i << "\n"; } 
private: 
    int i = 42; // will propagate to the default constructor! 
}; 

int main() 
{ 
    Test const t; // <-- Clang chokes on the const keyword, g++ does not 
    t.print(); // prints 42 
} 

तो तर्क भी उपयोगकर्ता- के लिए डिफ़ॉल्ट निर्माता मेरे लिए ज़रूरत से ज़्यादा लगता है प्रदान । और वास्तव में, g ++ 4.8.1 समस्याओं के बिना संकलित करता है (Online Example), हालांकि क्लैंग < = 3.2 नहीं है।

प्रश्न: पूर्ण इन-क्लास इनटाइटलरों का संयोजन क्यों है + उपयोगकर्ता द्वारा घोषित डिफ़ॉल्ट कन्स्ट्रक्टर डिफ़ॉल्ट रूप से एक कॉन्स्ट ऑब्जेक्ट बनाने के लिए पर्याप्त नहीं है? क्या सी ++ 14 मानक के लिए कोई फिक्स चल रहा है?

अद्यतन: क्या कोई क्लैंग 3.2/3.4 पर कोशिश कर सकता है यह देखने के लिए कि यह क्लैंग 3.2 की तुलना में तय किया गया है या नहीं?

+2

मुझे लगता है कि यह क्लैंग में एक गलती/बग है, और जी ++ कोड स्वीकार करने के लिए सही है। –

+0

@ जेरीकॉफिन इसके साथ जाने के लिए कोई मानक उद्धरण? मैं पूछता हूं क्योंकि इन-क्लास प्रारंभकर्ता के बिना, मानक कहता है कि क्लैंग सही है। – TemplateRex

+1

वास्तव में कोई उद्धरण नहीं है, लेकिन N3337 द्वारा, शब्द पहले ही बदल दिया गया था इसलिए यह आवश्यकता गायब हो गई थी। यह देखते हुए कि यह मानक में * है, मुझे लगता है कि यह एक गलती कह रहा है या बग शायद थोड़ा गलत है, लेकिन इस बिंदु पर मुझे लगता है कि ज्यादातर कंपाइलर ज्यादातर सी ++ 11 * प्रति से * को अनदेखा कर रहे हैं और नए ड्राफ्ट का पीछा कर रहे हैं। –

उत्तर

11

हां, यह एक ज्ञात समस्या है। http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#253 देखें। यह अभी तक कल्पना में तय नहीं किया गया है।

+0

+1 और स्वीकार किया गया। यह जानकर अच्छा लगा कि यह रडार पर है। – TemplateRex

+0

क्या आपको किसी भी मौके पर क्लैंग 3.3/3.4 तक पहुंच है, यह जांचने के लिए कि क्या यह अभी भी एक मुद्दा है? – TemplateRex

+0

@TemplateRex दुर्भाग्य से, क्लैंग 3.4 (ट्रंक 184647) के साथ यह अभी भी एक मुद्दा है। :( – Ali

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