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.