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 clr
i przypisać mu inną wartość. Dlaczego zmienia się w wartość, gdy próbuję ją przekazać func(unsigned int&)
?
enum
jestunsigned int
?typedef enum
nie jest rodzimym typem, a C ++ rzeczywiście traktowałby go jakounsigned int
typ.clr
.enum type
jest traktowany jakunsigned int
w C ++.enum X
jest swoim rodzajem, różniącym się odint
Odpowiedzi:
clr
sama w sobie jest wartością typuColor
. Ale funkcja nie akceptujeColor
. Akceptuje (odniesienie do)unsigned int
. Tak więc argument jest konwertowany (domyślnie). A wynikiem konwersji jest wartość typuunsigned int
.źródło
func(Color&)
zanim zadam pytanie, i to się kompiluje. Pomyślałem, że C ++ będzie traktowałenum
typ jakounsigned int
typ podczas kompilacji. Dzięki za odpowiedź.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
źródło
func(unsigned int&)
nafunc(Color&)
, kompilator zaakceptuje to. Myślę więc, że zmienna typu wyliczeniowego jest wartością.func(Color&)
i przechodzi.