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&)?


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.


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


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.