क्या sizeof (enum) sizeof (std :: अंतर्निहित_type <Enum> :: type) से भिन्न हो सकता है?


16

हाल ही में एक कोड समीक्षा में आया था कि निम्नलिखित उदाहरण में:

enum class A : uint8_t
{
    VAL1, VAL2 
};

...
std::vector<A> vOfA; // Assume this is sized and full of some stuff.
std::memcpy(wire_buffer, vOfA.data(), vOfA.size() * sizeof(A));

हमें sizeof(std::underlying_type<A>::type)इसके बजाय उपयोग करना चाहिए sizeof(A)क्या यह संभव है कि ये कभी अलग हो सकते हैं? क्या किसी के पास एक मानक उद्धरण है जो इसकी गारंटी देता है?


लिंक करना सी में एक enum प्रकार के डेटा के आकार है क्या ++? (जिसे स्कूप्ड को भी कवर किया जाना चाहिए :-))
एकोर्न

3
यहां तक ​​कि अगर वे एक ही आकार के हैं (जो कि मामले की संभावना से अधिक है), तो उपयोग करने के खिलाफ तर्क क्या है sizeof(A)? इसके अलावा: यदि वे एक अलग आकार (असंभावित) हैं, तो उपयोग sizeof(std::underlying_type<A>)करना गलत होगा।
सांडेर डे डाइकर

1
sizeof(std::underlying_type<A>)शायद है 1। क्या आपका मतलब था ::type?
एलएफ

1
@SanderDeDycker हाँ, जब एस के साथ काम कर रहा है A, तो एक निश्चित रूप से उपयोग करना चाहता है sizeof(A)और कोड को ध्यान नहीं देना चाहिए कि किस प्रकार का Aहै।
एकोर्न

@ एलएफ हां, टाइपो। शीर्षक सही था।
शानदार श्री फॉक्स

जवाबों:


12

C ++ 03 में इसकी गारंटी दी गई थी (वैसे भी, बिना किसी गणना के)।

[dcl.enum] गणना घोषणाएं (जोर मेरा)

6 अंतर्निहित प्रकार का एन्यूमरेशन एक अभिन्न प्रकार है जो एन्यूमरेशन में परिभाषित सभी एन्यूमरेटर मानों का प्रतिनिधित्व कर सकता है। यदि कोई अभिन्न प्रकार सभी एन्यूमरेटर मूल्यों का प्रतिनिधित्व नहीं कर सकता है, तो एन्यूमरेशन बीमार है। यह कार्यान्वयन-परिभाषित है जो एक अभिन्न प्रकार के लिए अंतर्निहित प्रकार के रूप में अभिन्न प्रकार का उपयोग किया जाता है, सिवाय इसके कि अंतर्निहित प्रकार इंट से बड़ा नहीं होगा जब तक कि एक एन्यूमरेटर का मान किसी इंट या अहस्ताक्षरित इंट में फिट नहीं हो सकता। यदि एन्यूमरेटर-सूची खाली है, तो अंतर्निहित प्रकार ऐसा है जैसे कि एन्यूमरेशन में वैल्यू के साथ एक एन्यूमरेटर था। एन्यूमरेशन टाइप पर लागू किया गया मान sizeof(), एन्यूमरेशन टाइप का ऑब्जेक्ट, या एन्यूमरेटर, के लिए sizeof()लागू मूल्य है अंतर्निहित प्रकार

उसके बाद आया n2347 , जो कागज को जोरदार टाइप किए गए एन्यूमरेशंस ( enum class) और अन्य एन्हांसमेंट के लिए अपनाया गया था , और इसमें बोल्ड हटाए गए वाक्य थे। दिलचस्प रूप से पर्याप्त है, प्रस्ताव के एक पुराने संस्करण, n2213 , को हटाए गए वाक्य के लिए एक प्रतिस्थापन था। लेकिन इसे उस संस्करण में नहीं बनाया गया जिसे अपनाया गया था।

इसलिए आधुनिक सी ++ में, आकारों के समान होने के लिए कोई दायित्व नहीं है। हालांकि एक व्यावहारिक दृष्टिकोण से, कार्यान्वयन के लिए गणना आकार के लिए C ++ 03 द्वारा निर्धारित व्यवहार को बदलने की संभावना नहीं है।

कोई इसे मानक में दोष बता सकता है।


2
एक विशेषता के लिए C + 03 में कुछ की गारंटी कैसे दी जा सकती है जो भाषा में मौजूद नहीं थी? oO
को ऑर्बिट में

4
@LightnessRaceswithMonica - एक अंतर्निहित प्रकार की धारणा नई नहीं है। यह सिर्फ इतना है कि C ++ 11 ने आपको इसे स्वयं निर्दिष्ट करने की अनुमति दी है।
स्टोरीटेलर - Unslander Monica

मुझे पता है। स्कूप्ड एनुम ( enum class) की धारणा नई है।
को ऑर्बिट में

@LightnessRaceswithMonica - मुझे लगता है कि कोई संभावित रूप से यहां प्रस्ताव को गलत कर सकता है। इसने दो काम किए, स्कोप किए हुए एन्यूमरेशन पेश किए और सभी एन्यूमरेशन (सिर्फ स्कॉप्ड नहीं) को अपने अंतर्निहित प्रकार सेट करने की अनुमति दी। इसलिए "गारंटी" C ++ 03 में।
स्टोरीटेलर - Unslander Monica

1
@ StoryTeller-UnslanderMonica हाँ, प्रश्न वही है जो मुझे लगता है, स्कोप या अनकैप्ड है।
शानदार श्री फॉक्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.