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


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.


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


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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.