Beispiel:
typedef enum Color
{
RED,
GREEN,
BLUE
} Color;
void func(unsigned int& num)
{
num++;
}
int main()
{
Color clr = RED;
func(clr);
return 0;
}
Beim Kompilieren wird folgende Fehlermeldung angezeigt:
<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);
^~~
Ich denke, die Variable ( clr
), an die ich übergebe, func(unsigned int&)
ist ein Wert. Ich kann die Adresse von erhalten clr
und ihm einen anderen Wert zuweisen. Warum wird es zu einem Wert, wenn ich versuche, ihn weiterzugeben func(unsigned int&)
?
enum
aunsigned int
?typedef enum
handelt es sich nicht um einen nativen Typ, und C ++ würde ihnunsigned int
tatsächlich als Typ behandeln .clr
.enum type
sei wieunsigned int
in C ++ zu behandeln.enum X
ist ein eigener Typ, der sich vonint
Antworten:
clr
selbst ist ein Wert vom TypColor
. Die Funktion akzeptiert jedoch kein aColor
. Es akzeptiert a (Verweis auf)unsigned int
. Das Argument wird also (implizit) konvertiert. Und das Ergebnis der Konvertierung ist ein Wert vom Typunsigned int
.quelle
func(Color&)
bevor ich die Frage stelle, und es kompiliert den Pass. Ich dachte nur, C ++ würde Typ beim Kompilierenenum
alsunsigned int
Typ behandeln . Danke für deine Antwort.Aufzählungstyp init und Zuweisung müssen innerhalb von , enum sein, damit Aufzählungstyp nicht lvalue ist。 void func (unsigned int & num) Diese Funktion benötigt Anführungszeichen
quelle
func(unsigned int&)
zufunc(Color&)
, es Compiler zu akzeptieren. Ich denke also, dass die Variable vom Typ enum ein Wert ist.func(Color&)
, und es geht vorbei.