2016-06-24 8 views
6

मेरे पास the following code है जो मुझे लगता है कि संकलित होना चाहिए लेकिन नहीं।संदर्भ द्वारा enum वर्ग के साथ पास enum

prog.cpp:15:9: error: invalid initialization of non-const reference of type 'uint8_t& {aka unsigned char&}' from an rvalue of type 'uint8_t {aka unsigned char}' 
    foo(baz); 

मेरे मन में, यह क्योंकि सब कुछ एक ही अंतर्निहित प्रकार (uint8_t) का है काम करना चाहिए:

#include <cstdint> 

typedef uint8_t testtype; 

enum testenum : uint8_t { 
}; 

void foo(uint8_t& v) {} 

int main() { 
    testtype bar; 
    foo(bar); 

    testenum baz; 
    foo(baz); 

    return 0; 
} 

मैं निम्नलिखित त्रुटि मिलती है। एक typedef'ed चर foo फ़ंक्शन पर पास किया जा सकता है, लेकिन enum (जिसमें enum class uint8_t है) नहीं हो सकता है।

मेरी प्रोजेक्ट में इसका क्या अर्थ है कि मैं अपने सभी enums को एक ओवरलोडेड फ़ंक्शन में पास नहीं कर सकता - ऐसा लगता है कि मुझे हर संभव enum के लिए एक अधिभार बनाना है।

क्या यह संकलित करने के लिए एक शानदार तरीका है, या क्या मुझे एक दूसरे चर के माध्यम से enum पास करना है जिसे मैं संदर्भ से पारित कर सकता हूं?

+4

'testenum' 'uint8_t' से और कनवर्ट कर सकता है, लेकिन वे समान नहीं हैं। आप जो देख रहे हैं वह यह है कि रूपांतरण का नतीजा एक रैल्यू है जो गैर कॉन्स्ट संदर्भ के लिए बाध्य नहीं हो सकता है। – Dani

उत्तर

9

सी ++ में एनम्स केवल एक पूर्णांक के लिए नाम लागू करने से अधिक हैं; हमारे पास const int इसके लिए चर हैं। Enums अवधारणात्मक रूप से एक पूर्णांक का प्रतिनिधित्व करते हैं जो केवल विशिष्ट मानों के एक सेट को स्टोर करना है।

टाइपपीफ उपनाम हैं; वे दिए गए प्रकार के हर तरीके में समान हैं। एनम्स विशिष्ट प्रकार हैं। वे अपने अंतर्निहित प्रकारों का उपयोग करते हैं, और वे परिवर्तित कर सकते हैं, लेकिन वे समान उनके अंतर्निहित प्रकार के रूप में टाइप नहीं हैं।

इस तरह, uint8_t का संदर्भ एक enum के संदर्भ के समान नहीं है, भले ही वह enum uint8_t इसका अंतर्निहित प्रकार के रूप में उपयोग करता हो। एक संदर्भ-से-enum से संदर्भ-से-अंतर्निहित प्रकार में कनवर्ट करना इसलिए एक अवैध रूपांतरण है, साथ ही सख्त एलियासिंग को तोड़ना है।

आप इसे मूल्य से पारित कर सकते हैं, क्योंकि गैर-श्रेणी के enums उनके अंतर्निहित प्रकारों के लिए पूरी तरह से परिवर्तनीय हैं। और आप const& से गुजर सकते हैं, क्योंकि अंतर्निहित रूपांतरण उस संदर्भ को भरने के लिए अस्थायी बना सकता है। लेकिन आप किसी फ़ंक्शन में गणना नहीं कर सकते हैं जो एक पूर्णांक के संदर्भ में गैर-const लेता है।