भ्रम यह है कि सी स्पष्ट रूप से एक संघ के माध्यम से टाइप-पाइंटिंग की अनुमति देता है, जबकि सी ++ (c ++ 11) की ऐसी कोई अनुमति नहीं है।
C11
6.5.2.3 संरचना और संघ के सदस्य
95) यदि सदस्य किसी संघ वस्तु की सामग्री को पढ़ने के लिए उपयोग नहीं करता है, तो अंतिम रूप से सदस्य का उपयोग वस्तु में मूल्य को संग्रहीत करने के लिए किया जाता है, मूल्य के वस्तु प्रतिनिधित्व का उचित हिस्सा नए में ऑब्जेक्ट प्रतिनिधित्व के रूप में पुनर्व्याख्या किया जाता है जैसा कि 6.2.6 में वर्णित है (एक प्रक्रिया जिसे कभी-कभी 'टाइप पिंगिंग' कहा जाता है)। यह एक जाल प्रतिनिधित्व हो सकता है।
C ++ के साथ स्थिति:
c ++ 11
9.5 यूनियनों [class.union]
एक संघ में, गैर-स्थैतिक डेटा सदस्यों में से अधिकांश किसी भी समय सक्रिय हो सकता है, अर्थात, गैर-स्थैतिक डेटा सदस्यों में से अधिकांश का मूल्य किसी भी समय संघ में संग्रहीत किया जा सकता है।
C ++ में बाद में struct
सामान्य प्रारंभिक अनुक्रमों के साथ s यूनियनों के उपयोग की अनुमति देने वाली भाषा है ; हालांकि यह टाइप-पैंटिंग की अनुमति नहीं देता है।
यह निर्धारित करने के लिए कि क्या C ++ में यूनियन टाइप-पैंटिंग की अनुमति है, हमें और खोज करनी होगी। याद करें किc99 C ++ 11 के लिए एक मानक संदर्भ है (और C99 में C11 की समान भाषा है जो यूनियन टाइप-पिंगिंग है):
3.9 प्रकार [basic.types]
4 - टाइप टी के ऑब्जेक्ट का ऑब्जेक्ट प्रतिनिधित्व N का अनुक्रम है जो टाइप T के ऑब्जेक्ट द्वारा उठाए गए अहस्ताक्षरित चार ऑब्जेक्ट हैं, जहां एन आकार आकार (टी) के बराबर होता है। किसी वस्तु का मूल्य निरूपण बिट्स का सेट है जो टाइप T का मान रखता है। तुच्छ रूप से प्रतिलिपि योग्य प्रकारों के लिए, मूल्य प्रतिनिधित्व ऑब्जेक्ट प्रतिनिधित्व में बिट्स का एक सेट है जो एक मूल्य निर्धारित करता है, जो कार्यान्वयन का एक असतत तत्व है- मानों का सेट 42
42) आशय यह है कि C ++ का मेमोरी मॉडल ISO / IEC 9899 प्रोग्रामिंग लैंग्वेज C के अनुकूल है।
जब हम पढ़ते हैं तो यह विशेष रूप से दिलचस्प हो जाता है
3.8 वस्तु जीवनकाल [बुनियादी। जीवन]
एक प्रकार की वस्तु T का जीवनकाल तब शुरू होता है जब: - प्रकार T के लिए उचित संरेखण और आकार के साथ भंडारण प्राप्त किया जाता है, और - यदि वस्तु में गैर-तुच्छ आरंभीकरण है, तो इसका आरंभीकरण पूरा हो गया है।
तो एक आदिम प्रकार के लिए (जिसमें ipso facto में तुच्छ इनिशियलाइज़ेशन है) एक संघ में निहित है, वस्तु का जीवनकाल कम से कम यूनियन के जीवनकाल को शामिल करता है। यह हमें आह्वान करने की अनुमति देता है
3.9.2 यौगिक प्रकार [basic.compound]
यदि टाइप A का ऑब्जेक्ट पता A पर स्थित है, तो टाइप Cv T * का पॉइंटर जिसका मान A पता है, उस ऑब्जेक्ट को इंगित करने के लिए कहा जाता है, भले ही मान कैसे प्राप्त किया गया हो।
यह मानते हुए कि जिस ऑपरेशन में हम रुचि रखते हैं, वह टाइप-पेन्जिमेंट है अर्थात एक गैर-सक्रिय संघ के सदस्य का मान लेना, और ऊपर दिया गया है कि हमारे पास उस सदस्य द्वारा संदर्भित ऑब्जेक्ट का एक वैध संदर्भ है, वह ऑपरेशन है -वृद्धि रूपांतरण:
४.१ लव-टू-रैवल्यू रूपांतरण [conv.lval]
एक गैर-फ़ंक्शन, गैर-सरणी प्रकार की T
एक चमक को एक प्रचलन में परिवर्तित किया जा सकता है। यदि T
एक अधूरा प्रकार है, तो इस रूपांतरण की आवश्यकता वाला एक प्रोग्राम बीमार है। यदि जिस वस्तु से ग्लव्यू संदर्भित होता है वह ऑब्जेक्ट प्रकार की वस्तु T
नहीं है और यह व्युत्पन्न प्रकार का ऑब्जेक्ट नहीं है T
, या यदि ऑब्जेक्ट अनइंस्टालिज्ड है , तो इस रूपांतरण के लिए आवश्यक प्रोग्राम को unde। Ned व्यवहार है।
फिर सवाल यह है कि क्या एक गैर-सक्रिय संघ के सदस्य एक वस्तु को सक्रिय संघ के सदस्य को भंडारण द्वारा प्रारंभ किया जाता है। जहाँ तक मैं बता सकता हूँ, यह मामला नहीं है और इसलिए यदि:
- एक यूनियन को
char
ऐरे स्टोरेज और बैक (3.9: 2), या में कॉपी किया जाता है
- एक संघ को उसी प्रकार के दूसरे संघ में कॉपी किया जाता है (3.9: 3), या
- ISO / IEC 9899 (अब तक परिभाषित किया गया है) के अनुरूप एक संघ तत्व द्वारा भाषा सीमाओं के पार एक संघ तक पहुँचा जा सकता है (3.9: 4 नोट 42), फिर
एक गैर-सक्रिय सदस्य द्वारा एक संघ तक पहुंच को परिभाषित किया गया है और वस्तु और मूल्य प्रतिनिधित्व का पालन करने के लिए परिभाषित किया गया है, ऊपर दिए गए किसी भी एक के बिना उपयोग अपरिभाषित व्यवहार है। इस तरह के एक कार्यक्रम पर प्रदर्शन करने की अनुमति के लिए इसके निहितार्थ हैं, क्योंकि कार्यान्वयन बेशक यह मान सकता है कि अपरिभाषित व्यवहार नहीं होता है।
यह है, हालांकि हम वैध रूप से एक गैर-सक्रिय संघ के सदस्य के लिए एक अंतराल बना सकते हैं (यही वजह है कि निर्माण के बिना एक गैर-सक्रिय सदस्य को असाइन करना ठीक है) इसे अनैतिक रूप से माना जाता है।