Dlaczego zmienna wyliczana jest tutaj wartością?

12

Przykład:

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

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

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

Podczas kompilacji pojawia się następujący błąd:

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

         ^~~

Myślę, że zmienna ( clr), którą przekazuję, func(unsigned int&)jest wartością. Mogę uzyskać adres clri przypisać mu inną wartość. Dlaczego zmienia się w wartość, gdy próbuję ją przekazać func(unsigned int&)?

Koen
źródło
5
Zadaj sobie pytanie: czy to enumjest unsigned int?
NathanOliver
@ NathanOliver-ReinstateMonica W mojej pierwotnej opinii uważam, że typedef enumnie jest rodzimym typem, a C ++ rzeczywiście traktowałby go jako unsigned inttyp.
Koen,
1
Komunikat o błędzie GCC jest w tym przypadku nieoptymalny. Clang da mniej mylący komunikat, drukując oryginalny typ clr.
cpplearner
@ cpplearner tak, dlatego myślałem, że enum typejest traktowany jak unsigned intw C ++.
Koen,
enum Xjest swoim rodzajem, różniącym się odint
MM

Odpowiedzi:

22

clrsama w sobie jest wartością typu Color. Ale funkcja nie akceptuje Color. Akceptuje (odniesienie do) unsigned int. Tak więc argument jest konwertowany (domyślnie). A wynikiem konwersji jest wartość typu unsigned int.

eerorika
źródło
1
Tak, próbuję, func(Color&)zanim zadam pytanie, i to się kompiluje. Pomyślałem, że C ++ będzie traktował enumtyp jako unsigned inttyp podczas kompilacji. Dzięki za odpowiedź.
Koen
Jedną z rzeczy, które zwiększają zamieszanie, jest to, że C jest prawie doskonałym podzbiorem C ++. Przynajmniej wszystko, co możesz zrobić w C, możesz zrobić w C ++ z prawie identycznym kodem, szczególnie na gcc / clang. Będziesz także potrzebował konstrukcji zależnych od kompilatora, jako zamiennik C ++ dla „ograniczenia” w C, który zapewnia gcc. Wyliczenia różnią się w C i C ++, na przykład jeśli someColor jest wyliczeniem, „someColor = 1” jest legalnym C, ale nie C ++.
Erik Alapää
0

typ wyliczenia init i przypisanie musi być wyliczone wewnątrz, więc typ wyliczenia nie może mieć wartości。 void func (unsigned int & num) ta funkcja wymaga typu cytowania

nadczłowiek
źródło
Jeśli zmienię func(unsigned int&)na func(Color&), kompilator zaakceptuje to. Myślę więc, że zmienna typu wyliczeniowego jest wartością.
Koen,
nie, ponieważ typ wyliczenia nie może przydzielić int enum zdefiniować na zewnątrz
superman
Masz na myśli, że wciąż jest to wartość? Ale wiążę do niej nie-stałe odwołanie do wartości func(Color&)i przechodzi.
Koen
tak, nadal jest to wartość, func (kolor i klawisz) ta funkcja param tylko przypisanie CZERWONY, ZIELONY, NIEBIESKI, w przeciwnym razie będzie to błąd。
superman
instrukcje cpp
superman