नीचे दिया गया कोड एक गैर-तुच्छ डिफ़ॉल्ट डिफॉल्ट कन्स्ट्रक्टर (सदस्य y
के साथ एक यूनियन-जैसी कक्षा दिखाता है ब्रेस-या-बराबर-प्रारंभकर्ता) के साथ प्रारंभ किया गया है, इसलिए यदि इस तरह के वर्ग के लिए डिफ़ॉल्ट कन्स्ट्रक्टर डिफॉल्ट किया गया है, तो इसे §12.1/5 पहले बुलेट बिंदु के अनुसार हटा दिया जाना चाहिए। यही है, घोषणा T t;
संकलित नहीं होनी चाहिए, क्योंकि union T
के लिए कोई डिफ़ॉल्ट कन्स्ट्रक्टर नहीं है। लेकिन क्लैंग और जीसीसी में code compiles and executes।AFAIK, नीचे दिया गया कोड संकलित नहीं होना चाहिए, लेकिन यह क्लैंग और जीसीसी में करता है। मुझे यहां क्या समझ नहीं आ रहा है?
#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';
}
"डिफॉल्ट कन्स्ट्रक्टर जिसे डिफॉल्ट किया गया है और हटाए गए रूप में परिभाषित नहीं किया गया है, यह स्पष्ट रूप से परिभाषित किया जाता है जब यह ओड-र्यूज्ड होता है" क्योंकि आपका कन्स्ट्रक्टर ओडीआर-प्रयुक्त होता है, क्या यह वैध कोड नहीं होना चाहिए? – AndyG
यह बिना मुद्दों के वीएस 2015 पूर्वावलोकन के लिए भी संकलित करता है। – PaulMcKenzie
एक संघ का उद्देश्य क्या है जिसे आप किसी भी तरह से तत्काल नहीं कर सकते? –