2011-10-16 8 views
9

सी ++ 11 एनम कक्षाओं को जोड़ता है, जो मजबूत टाइप किए गए enums हैं - enum कक्षाओं के मूल्यों को अन्य enum कक्षाओं या पूर्णांक के मूल्यों में पूरी तरह से परिवर्तित नहीं किया जाएगा, और एक स्पष्ट आकार विनिर्देशक के आधार पर आगे की घोषणाओं की अनुमति है।क्या मैं enum वर्ग मानों का उपयोग varargs कार्यों के तर्क के रूप में कर सकता हूं?

क्या विविधता कार्यों के लिए ऐसी गणनाओं के मूल्यों को पार करना संभव है और मानक-परिभाषित व्यवहार में रहते हैं? कार्यान्वयन-परिभाषित व्यवहार के भीतर?

+0

+1, अच्छा सवाल मुझे जवाब देने के लिए हाल के मसौदे को देखने की ज़रूरत है! – Flexo

उत्तर

8

हाँ, आप कर सकते हैं। 5.2.2/7 स्पष्ट रूप से किसी भी गणना प्रकार के तर्क की अनुमति देता है। Unscoped enum मान पूर्णांक पदोन्नत हैं, लेकिन scoped enums (enum class वाले) नहीं हैं।

बेशक आपको अभी भी फ़ंक्शन के कार्यान्वयन में सावधान रहना होगा।

+1

+1 - मुझे पूरा यकीन है कि अगर 'एनम क्लास' से छूट दी गई थी तो वहां एक नोट होगा। – Flexo

+1

मुझे आश्चर्य है कि क्या यह यूबी 'va_arg' के साथ अंतर्निहित प्रकार का उपयोग करने के लिए है, जब तर्क प्राप्त हुआ एक स्कॉम्ड गणना मूल्य था? ऐसा लगता है कि यह है। –

+0

@ जोहान्स: यदि यूबी का कारण बनता है, तो क्या वह अंतर्निहित प्रकार को पहले स्थान (समान मूल्य प्रतिनिधित्व) निर्दिष्ट करने के उद्देश्य को हराने नहीं देता है? – ildjarn

1

मुझे लगता है कि इस सवाल का जवाब है कि यह सुरक्षित किया जा सकता है:

VA_ARGS पॉड, है कि जहाँ तक मुझे पता है कर रहा हूँ नहीं बदला जा करने के लिए तर्क की आवश्यकता है।

मैं किसी भी कारण से क्यों नहीं देख सकते हैं:

enum class foo { bar=1 }; 

हालांकि पॉड सत्ता के लिए आवश्यकताओं को पूरा नहीं होगा।

0

जब आप varargs का उपयोग करते समय कुछ प्रकार की जानकारी निकाल देते हैं (यही कारण है कि यह गैर पीओडी प्रकारों के लिए दृढ़ता से निराश होता है) तो आप फ़ंक्शन का उपयोग करके अपने varargs के दूसरे छोर पर अंतर्निहित प्रकार प्राप्त करेंगे। डिफ़ॉल्ट int है, लेकिन है कि आप बदल सकते हैं (उदाहरण के लिए enum class MyEnum : char { ... };)

सही किया: varargs है वास्तव में दूर सब प्रकार की जानकारी फेंक नहीं और प्रकार आप काफी सुरक्षित हो सकता है अगर आप पॉड डेटा का उपयोग करें।

+1

यह वास्तव में मानक नहीं कहता है। सभी प्रकार की जानकारी नहीं फेंक दी जाती है। –

+1

'int' डिफ़ॉल्ट के रूप में केवल स्कॉप्ड एन्युमरेशन के लिए सच है (जो सभी के बाद यहां चर्चा में हैं)। –

+0

@AlanStokes: धन्यवाद। मैंने अपने पिछले बोल्ड स्टेटमेंट में संशोधन करने की कोशिश की। 5.2.2/7 संदर्भ के लिए – Florian

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

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