सी ++ 11 में धारा 9.6/3 असामान्य रूप से स्पष्ट है: "एक गैर-कॉन्स्ट संदर्भ थोड़ा-सा क्षेत्र तक सीमित नहीं होगा।" इस निषेध के पीछे प्रेरणा क्या है?बिटफील्ड के लिए गैर-कॉन्स्ट संदर्भ क्यों प्रतिबंधित हैं?
मैं समझता हूं कि सीधे एक बिटफील्ड के संदर्भ को बाध्य करना संभव नहीं है। लेकिन अगर मैं इस तरह कुछ घोषित करता हूं,
struct IPv4Header {
std::uint32_t version:4, // assumes the IPv4 Wikipedia entry is correct
IHL:4,
DSCP:6,
ECN:2,
totalLength:16;
};
मैं यह क्यों नहीं कह सकता?
IPv4Header h;
auto& ecn = h.ECN;
मैं अंतर्निहित कोड वास्तव में पूरे std::uint32_t
कि बिट्स मैं में दिलचस्पी रखता हूँ में शामिल करने के लिए बाध्य करने के लिए उम्मीद थी, और मैं उम्मीद थी पढ़ने और लिखने के संचालन उचित मास्किंग करने के लिए कोड उत्पन्न करने के लिए। नतीजा बड़ा और धीमा हो सकता है, लेकिन ऐसा लगता है कि इसे काम करना चाहिए। स्टैंडर्ड इस तरह के अनुरूप होगा का कहना है कि const
bitfields काम (फिर 9.6/3 से) के लिए संदर्भ:
हैं प्रकार स्थिरांक टी & के संदर्भ के लिए प्रारंभकर्ता एक lvalue कि थोड़ा के लिए संदर्भित करता है -फील्ड, संदर्भ पर प्रारंभिक अस्थायी के लिए बाध्य है बिट-फ़ील्ड का मान रखें; संदर्भ सीधे बिट-फ़ील्ड से बाध्य नहीं है।
इससे पता चलता है कि बिटफील्ड को लिखना समस्या है, लेकिन मुझे नहीं पता कि यह क्या है। मैंने संभावना को माना कि आवश्यक मास्किंग मल्टीथ्रेड कोड में दौड़ पेश कर सकती है, लेकिन, 1.7/3 प्रति, गैर-शून्य चौड़ाई के आसन्न बिटफील्ड को मल्टीथ्रेडिंग के उद्देश्यों के लिए एक वस्तु माना जाता है। उपर्युक्त उदाहरण में, IPv4Header
ऑब्जेक्ट में सभी बिटफील्ड को एक ऑब्जेक्ट माना जाएगा, इसलिए बहु फ़ील्ड कोड अन्य फ़ील्ड पढ़ने के दौरान फ़ील्ड को संशोधित करने का प्रयास कर रहा है, परिभाषा के अनुसार, पहले से ही दुर्लभ हो सकता है।
मैं स्पष्ट रूप से कुछ याद कर रहा हूं। यह क्या है?
मैं इसे उत्तर के रूप में चिह्नित कर रहा हूं, क्योंकि यह स्पष्ट करता है कि मुझे लगता है कि मुख्य तर्क क्या है: यदि बिट स्फील्ड रखने वाले शब्द का संदर्भ मुझे स्केच करने के तरीके पर काम करना था, तो इसके बारे में अतिरिक्त जानकारी की आवश्यकता होगी बिडफील्ड को शब्द में ऑफसेट करें, और यह व्यावहारिक रूप से लागू नहीं किया जा सकता है संदर्भ-बिंदु-पॉइंटर्स-अंडर-द-हूड मॉडल जो सी ++ नियोजित करता है। – KnowItAllWannabe