2015-02-20 5 views
6

नीचे दिया गया कोड एक गैर-तुच्छ डिफ़ॉल्ट डिफॉल्ट कन्स्ट्रक्टर (सदस्य y के साथ एक यूनियन-जैसी कक्षा दिखाता है ब्रेस-या-बराबर-प्रारंभकर्ता) के साथ प्रारंभ किया गया है, इसलिए यदि इस तरह के वर्ग के लिए डिफ़ॉल्ट कन्स्ट्रक्टर डिफॉल्ट किया गया है, तो इसे §12.1/5 पहले बुलेट बिंदु के अनुसार हटा दिया जाना चाहिए। यही है, घोषणा T t; संकलित नहीं होनी चाहिए, क्योंकि union T के लिए कोई डिफ़ॉल्ट कन्स्ट्रक्टर नहीं है। लेकिन क्लैंग और जीसीसी में code compiles and executesAFAIK, नीचे दिया गया कोड संकलित नहीं होना चाहिए, लेकिन यह क्लैंग और जीसीसी में करता है। मुझे यहां क्या समझ नहीं आ रहा है?

#include <iostream> 
union T 
{ 
    int y{1}; 
    float x; 
    char c; 
    T() = default; 
}; 

int main() 
{ 
    T t; 
    std::cout << t.y << '\n'; 
} 

संपादित

मेरा प्रश्न उपरोक्त शुरू से ही गलत सही था, के रूप में संघ टी नहीं है एक संघ की तरह वर्ग

एक संघ की तरह वर्ग एक संघ या एक वर्ग प्रत्यक्ष सदस्य के रूप में एक गुमनाम संघ है कि: मैं बस सी ++ 11 जो कहते हैं के बारे में §9.5/8 में पता चला। एक यूनियन-जैसे क्लास एक्स का संस्करण सदस्य का सेट है। यदि एक्स एक संघ है तो इसके संस्करण सदस्य गैर स्थैतिक डेटा सदस्य हैं; अन्यथा, अपने संस्करण के सभी सदस्य गुमनाम यूनियनों कि एक्स

के सदस्यों अब कर रहे हैं की गैर स्थैतिक डेटा सदस्य हैं, नीचे दिए गए स्निपेट पर विचार करें। यह संकलित नहीं है क्योंकि संघ के लिए डिफ़ॉल्ट कन्स्ट्रक्टर हटा दिया गया है। लेकिन मैं अभी भी नहीं जानता कि इस परिणाम के लिए §12.1/5 में कौन सा बुलेट बिंदु प्रतिलिपि है। ध्यान दें कि फिर से, संघ यूनियन जैसी कक्षा नहीं है और इसलिए, §12.1/5 में पहला बुलेट बिंदु लागू नहीं होता है। लेकिन क्लैंग और जीसीसी दोनों में त्रुटि संदेश यही कहता है। live example देखें।

#include <iostream> 

union T{ 
    int y; 
    struct A{ int i; A():i{1} {} } a; 
}; 

int main() 
{ 
    T t; 
    std::cout << t.a.i << '\n'; 
} 
+0

"डिफॉल्ट कन्स्ट्रक्टर जिसे डिफॉल्ट किया गया है और हटाए गए रूप में परिभाषित नहीं किया गया है, यह स्पष्ट रूप से परिभाषित किया जाता है जब यह ओड-र्यूज्ड होता है" क्योंकि आपका कन्स्ट्रक्टर ओडीआर-प्रयुक्त होता है, क्या यह वैध कोड नहीं होना चाहिए? – AndyG

+1

यह बिना मुद्दों के वीएस 2015 पूर्वावलोकन के लिए भी संकलित करता है। – PaulMcKenzie

+1

एक संघ का उद्देश्य क्या है जिसे आप किसी भी तरह से तत्काल नहीं कर सकते? –

उत्तर

11

गोली

X एक संघ की तरह वर्ग एक गैर तुच्छ डिफ़ॉल्ट निर्माता

जो

के रूप में पार्स किया गया है के साथ एक संस्करण सदस्य वाले है

X एक यूनियन-जैसी कक्षा है जिसमें एक भिन्न है "एक गैर तुच्छ डिफ़ॉल्ट निर्माता के साथ" एक गैर तुच्छ डिफ़ॉल्ट निर्माता के साथ टी सदस्य)

अर्थात, संस्करण सदस्य नहीं X के प्रकार के लिए लागू होता है।

+0

फिर भी, 'y' गैर-तुच्छ के लिए डिफ़ॉल्ट कन्स्ट्रक्टर नहीं है? या शायद गैर-तुच्छता की अवधारणा अंतर्निहित प्रकार पर लागू नहीं होती है? – Ayrosa

+4

@ एरोसा 'वाई' एक 'int' है, जो सभी आदिम प्रकारों की तरह कोई रचनाकार नहीं है। अकेले गैर-तुच्छ रचनाकारों को चलो।परिभाषा 'int {{}} में * ब्रेस-या-बराबर-प्रारंभकर्ता * '{1}' '' y' के लिए एक कन्स्ट्रक्टर नहीं है, इसका उपयोग * यूनियन के * कन्स्ट्रक्टर में 'y' प्रारंभ करने के लिए किया जाता है, जब नहीं अन्य प्रारंभकर्ता प्रदान किया जाता है। दूसरे शब्दों में, उस '{1}' की उपस्थिति का अर्थ है कि आपका 'टी() = डिफ़ॉल्ट;' टी(): y {1} {} 'जैसा ही प्रभाव है। – Casey

+0

@ टी.सी. क्या आप ऊपर ** मेरे ** संपादित ** पर टिप्पणी करना चाहते हैं? – Ayrosa

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