Burada enum değişkeni neden bir değerdir?


12

Misal:

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

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

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

Bunu derlediğimde aşağıdaki hatayı alıyorum:

<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);

         ^~~

Sanırım ilettiğim ( clr) değişkeni func(unsigned int&)bir değer. Adresini alabilir clrve ona başka bir değer atayabilirim. Bunu iletmeye çalıştığımda neden bir rvalueya dönüşüyor func(unsigned int&)?


5
Kendinize sorun: An enuma unsigned int?
NathanOliver

@ NathanOliver-ReinstateMonica Orijinal görüşüme göre, typedef enumyerel bir tür olmadığını düşünüyorum ve C ++ unsigned intgerçekten bir tür olarak kabul eder .
Koen

1
Bu durumda GCC'nin hata mesajı yetersizdir. Clang orijinal türünü yazdırarak daha az kafa karıştırıcı bir mesaj verecektir clr.
cpplearner

@cpplearner evet, bu yüzden C ++ enum typegibi tedavi olduğunu düşündüm unsigned int.
Koen

enum Xkendi tipidir, farklıdırint
MM

Yanıtlar:


22

clrkendisi bir tür değerdir Color. Ancak işlev a'yı kabul etmez Color. Bir (referans) kabul eder unsigned int. Böylece, argüman dönüştürülür (örtük olarak). Ve dönüşümün sonucu bir tür ön değerdir unsigned int.


1
Evet, func(Color&)soruyu sormadan önce deniyorum ve bu geçişi derliyor. Ben sadece C ++ tür derleme enumtürü olarak tedavi olacağını düşündüm unsigned int. Cevabınız için teşekkürler.
Koen

Karışıklık ekleyen bir şey, C neredeyse C ++ mükemmel bir alt kümesidir. En azından C'de yapabileceğiniz her şey, C ++ ile neredeyse aynı kodla, özellikle gcc / clang'da yapabilirsiniz. Ayrıca gcc tarafından sağlanan C'de 'restrict' için C ++ yerine derleyiciye bağlı yapılara ihtiyacınız olacaktır. C ve C ++ 'da numaralandırmalar farklıdır, örneğin someColor enum ise,' someColor = 1 'yasal C'dir, ancak C ++ değildir.
Erik Alapää

0

enum türü init ve atama içinde enum olmalıdır , enum türü olamaz lvalue。 void fonk (unsigned int & num)


Şunu değiştirirsem func(unsigned int&)için func(Color&), onu kabul derleyici. Bence enum tipi değişkeni bir değerdir.
Koen

hayır, çünkü enum türü atama yapamıyor int enum dışarıda tanımlayamıyor
superman

Hala bir değer mi demek istiyorsun? Ama ben buna const olmayan bir değer referansını bağlarım func(Color&)ve geçer.
Koen

evet still hala bir rvalue , fonk (Renk ve anahtar) bu işlev param tuşu yalnızca atama KIRMIZI, YEŞİL, MAVİ, Aksi takdirde hata verir。
superman

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.