Warum ist eine Aufzählungsvariable hier ein Wert?

12

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 clrund ihm einen anderen Wert zuweisen. Warum wird es zu einem Wert, wenn ich versuche, ihn weiterzugeben func(unsigned int&)?

Koen
quelle
5
Fragen Sie sich: Ist ein enuma unsigned int?
NathanOliver
@ NathanOliver-ReinstateMonica Meiner ursprünglichen Meinung nach typedef enumhandelt es sich nicht um einen nativen Typ, und C ++ würde ihn unsigned inttatsächlich als Typ behandeln .
Koen
1
Die Fehlermeldung von GCC ist in diesem Fall nicht optimal. Clang gibt eine weniger verwirrende Nachricht aus, indem der Originaltyp von gedruckt wird clr.
cpplearner
@cpplearner yep, deshalb dachte ich, es enum typesei wie unsigned intin C ++ zu behandeln.
Koen
enum Xist ein eigener Typ, der sich vonint
MM

Antworten:

22

clrselbst ist ein Wert vom Typ Color. Die Funktion akzeptiert jedoch kein a Color. Es akzeptiert a (Verweis auf) unsigned int. Das Argument wird also (implizit) konvertiert. Und das Ergebnis der Konvertierung ist ein Wert vom Typ unsigned int.

Eerorika
quelle
1
Ja, ich versuche es, func(Color&)bevor ich die Frage stelle, und es kompiliert den Pass. Ich dachte nur, C ++ würde Typ beim Kompilieren enumals unsigned intTyp behandeln . Danke für deine Antwort.
Koen
Eine Sache, die zur Verwirrung beiträgt, ist, dass C fast eine perfekte Teilmenge von C ++ ist. Zumindest alles, was Sie in C tun können, können Sie in C ++ mit fast identischem Code tun, insbesondere in gcc / clang. Sie benötigen auch compilerabhängige Konstrukte als C ++ - Ersatz für 'einschränken' in C, das von gcc bereitgestellt wird. Aufzählungen unterscheiden sich in C und C ++. Wenn beispielsweise someColor enum ist, ist 'someColor = 1' legal C, aber nicht C ++.
Erik Alapää
0

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

Übermensch
quelle
Wenn ich ändern func(unsigned int&)zu func(Color&), es Compiler zu akzeptieren. Ich denke also, dass die Variable vom Typ enum ein Wert ist.
Koen
Nein, da der Aufzählungstyp nicht zugewiesen werden kann. Aufzählung außerhalb definieren
Superman
Du meinst es immer noch ein Wert? Aber ich binde einen nicht konstanten Wertverweis darauf ein func(Color&), und es geht vorbei.
Koen
ja , es ist immer noch ein rwert , func (Farbe & Taste) diese Funktion param Taste nur Zuordnung ROT, GRÜN, BLAU, sonst wird es Fehler。
Superman
Sie können diese CPP-Anweisungen sehen
Superman