2017-11-07 3 views
6

संघ सदस्य सक्रिय क्या बनाता है?संघ सदस्य सक्रिय क्या करता है?

मैंने सी ++ 14 मानक (यूनियनों के बारे में एक) के अध्याय 9.5 को पढ़ा है, लेकिन मुझे एक संघीय सदस्य को सक्रिय करने का स्पष्ट उत्तर नहीं मिला है। ,

सामान्य तौर पर एक एक संघ के सक्रिय सदस्य को बदलने के लिए स्पष्ट नाशक कॉल और नियुक्ति के नए ऑपरेटरों का उपयोग करना चाहिए:

एक नोट है।

उदाहरण के लिए,

union U { 
    int i; 
    short s; 
} u; 

new(&u.i) int(42); 

ठीक है, नियुक्ति नए परिवर्तन सक्रिय सदस्य, यह स्पष्ट है। लेकिन हम आमतौर पर छोटे कन्स्ट्रक्टर के साथ प्रकार के साथ काम करते समय प्लेसमेंट नए का उपयोग नहीं करते हैं।

operator= यूबी के बिना सक्रिय सदस्य को बदलें?

u.i = 42; 

यहाँ, operator= एक Unconstructed वस्तु पर कहा जाता है। क्या यह अच्छी तरह परिभाषित है?

इसके बारे में क्या?

struct A { 
    int i0; 
    int i1; 
}; 
union U { 
    A a; 
    short s; 
} u; 

क्या a बनाता u का सक्रिय सदस्य होने के लिए? i0 & i1 दोनों को सेट कर रहा है?

u.a.i0 = 42; 
u.a.i1 = 99; 

क्या होगा यदि मैं लिखना:

u.a.i0 = 42;  // supposedly this doesn't change the active member to a, as i1 isn't set 
int x = u.a.i0; // is it fine to read from a.i0? a is not an active member supposedly 

u.a.i0 = 42; के बाद, सक्रिय सदस्य a (मुझे लगता है कि) में बदल नहीं है, तो यह यूबी int x = u.a.i0; क्या करना है?

क्या सी ++ 17 सक्रिय सदस्यों के विवरण पर सुधार करता है?

+0

"यहाँ,' ऑपरेटर = 'एक Unconstructed पर बुलाया वस्तु "क्या आप निश्चित हैं? यह पीओडी है तो यह ठीक लगता है। – BartoszKP

+1

लेमेन परिभाषा यह है कि यह आखिरी बार लिखा गया तत्व है। लेकिन मुझे मानक में इसका कोई महत्व नहीं मिल रहा है। – SergeyA

+0

@ BartoszKP: ठीक है, यह डायनेमिक टाइप निश्चित रूप से (?) 'Int' नहीं है, इसलिए ... मुझे नहीं पता :) – geza

उत्तर

5

सी ++ 17 में, एक पैरा जोड़ा गया है कि स्पष्ट रूप से u.i = 42 तरह के मामलों पर चर्चा करता है:

[class.union]/5 जब एक असाइनमेंट ऑपरेटर के बाईं संकार्य एक सदस्य पहुँच अभिव्यक्ति शामिल है (8.2.5) जो संघीय सदस्य को नामांकित करता है, यह नीचे बताए अनुसार उस संघ के सदस्य का जीवनकाल शुरू कर सकता है। एक अभिव्यक्ति E के लिए, E की subexpressions के सेट S(E) इस प्रकार निर्धारित करें:

(5,1) - अगर E रूप A.B की है, S(E)S(A) के तत्व शामिल हैं, और यह भी A.BB अगर नाम एक संघ सदस्य शामिल एक गैर-वर्ग, गैर-सरणी प्रकार, या एक वर्ग प्रकार का एक छोटा डिफ़ॉल्ट कन्स्ट्रक्टर जो हटाया नहीं गया है, या ऐसे प्रकारों की एक सरणी है।

(5।2) - यदि E फॉर्म A[B] है और इसे अंतर्निहित सरणी सबस्क्रिप्टिंग ऑपरेटर के रूप में व्याख्या किया गया है, S(E)S(A) है A सरणी प्रकार, S(B) है यदि B सरणी प्रकार का है, और अन्यथा खाली है।

(5.3) - अन्यथा, S(E) खाली है।

रूप E1 = E2 या तो, निर्मित असाइनमेंट ऑपरेटर (8.18) या एक छोटी सी असाइनमेंट ऑपरेटर (15.8) का उपयोग करता है प्रत्येक तत्व S(E1) की X के लिए की एक काम अभिव्यक्ति में, यदि X के संशोधन 6.8 के तहत अपरिभाषित व्यवहार होता है , X के प्रकार का एक वस्तु नामित भंडारण में अंतर्निहित रूप से बनाई गई है; कोई प्रारंभिकता नहीं की जाती है और बाएं और दाएं ऑपरेंड की मान गणना के बाद और असाइनमेंट से पहले इसके जीवनकाल की शुरुआत अनुक्रमित होती है। [नोट: यह संघ के पहले सक्रिय सदस्य के जीवनकाल को समाप्त करता है, यदि कोई है (6.8)। अंत टिप्पणी]

(एक longish उदाहरण है कि मैं बहुत आलसी हूँ इसके बाद ठीक से स्वरूपित करने के लिए है, लेकिन जो आप here देख सकते हैं।)

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