क्यों एक एनम चर यहाँ एक प्रतिद्वंद्विता है?


12

उदाहरण:

typedef enum Color
{
    RED,
    GREEN,
    BLUE
} Color;

void func(unsigned int& num)
{
    num++;
}

int main()
{
    Color clr = RED;
    func(clr);
    return 0;
}

इसे संकलित करने पर मुझे निम्न त्रुटि मिलती है:

<source>: In function 'int main()':

<source>:16:9: error: cannot bind non-const lvalue reference of type 'unsigned int&' to an rvalue of type 'unsigned int'

     func(clr);

         ^~~

मुझे लगता है कि मैं जिस चर ( clr) से गुजरता हूं func(unsigned int&)वह एक अंतराल है। मैं इसका पता प्राप्त कर सकता हूं clrऔर इसके लिए एक और मूल्य प्रदान कर सकता हूं । जब मैं इसे पास करने की कोशिश करता हूं तो यह एक प्रतिद्वंद्विता में क्यों बदल जाता है func(unsigned int&)?


5
अपने आप से पूछो: एक enumहै unsigned int?
नाथनऑलिवर

@ NathanOliver-ReinstateMonica मेरी मूल राय में, मुझे लगता typedef enumहै कि एक मूल प्रकार नहीं है, और C ++ इसे unsigned intवास्तव में एक प्रकार के रूप में माना जाएगा ।
कोन

1
इस मामले में GCC का एरर मैसेज सबॉप्टीमल है। क्लैंग मूल प्रकार को प्रिंट करके कम भ्रमित संदेश देगा clr
cpplearner

@cpplearner yep, यही कारण है कि मुझे लगा कि C ++ में enum typeइलाज किया unsigned intजाता है।
कोएन

enum Xअपने स्वयं के प्रकार, से अलग हैint
MM

जवाबों:


22

clrस्वयं एक प्रकार का अंतराल है Color। लेकिन फ़ंक्शन स्वीकार नहीं करता है Color। यह एक संदर्भ (संदर्भ) को स्वीकार करता है unsigned int। तो, तर्क को रूपांतरित (अनुमानित) किया जाता है। और रूपांतरण का परिणाम प्रकार का एक प्रचलन है unsigned int


1
हां, मैं func(Color&)प्रश्न पूछने से पहले कोशिश करता हूं, और यह पास संकलन करता है। मुझे लगा कि C ++ संकलन में enumटाइप के रूप में व्यवहार करेगा unsigned int। आपके उत्तर के लिए धन्यवाद।
कोएन

एक बात जो भ्रम में जोड़ती है, वह यह है कि C, C ++ का लगभग सही उपसमूह है। कम से कम, आप C में कुछ भी कर सकते हैं, आप C ++ में लगभग समान कोड के साथ कर सकते हैं, विशेषकर gcc / clang पर। आपको सी में 'प्रतिबंधित' के लिए सी ++ प्रतिस्थापन के रूप में संकलक निर्भर निर्माणों की भी आवश्यकता होगी जो कि जीसीसी द्वारा प्रदान की जाती है। सी और सी ++ में एनम अलग-अलग हैं, उदाहरण के लिए, अगर कुछ कॉनरम है तो 'someColor = 1' कानूनी सी है, लेकिन सी ++ नहीं।
एरिक अलापा

0

enum टाइप इनिट और असाइनमेंट type enum के अंदर होना चाहिए इसलिए enum टाइप lvalue नहीं हो सकता है oid void func (अहस्ताक्षरित int & num) इस फ़ंक्शन को उद्धरण प्रकार की आवश्यकता है


यदि मैं बदल func(unsigned int&)जाता हूं func(Color&), तो संकलक इसे स्वीकार करते हैं। इसलिए मुझे लगता है कि एनम टाइप वेरिएबल एक लैवल्यू है।
Koen

नहीं, क्योंकि Enum type असाइनमेंट int enum को बाहर परिभाषित नहीं कर सकता है
सुपरमैन

आप इसका मतलब यह अभी भी एक प्रतिद्वंद्विता है? लेकिन मैं इसमें नॉट-कास्ट लैवल्यू रेफरेंस को बांधता हूं func(Color&)और यह पास हो जाता है।
कोएन

हाँ c यह अभी भी एक ue func (रंग और कुंजी) इस फ़ंक्शन परम कुंजी केवल असाइनमेंट RED, GREEN, BLUE, अन्यथा यह त्रुटि करेगा
सुपरमैन

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.