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.