Pourquoi une variable enum est-elle une valeur r ici?

12

Exemple:

typedef enum Color
{
    RED,
    GREEN,
    BLUE
} Color;

void func(unsigned int& num)
{
    num++;
}

int main()
{
    Color clr = RED;
    func(clr);
    return 0;
}

J'obtiens l'erreur suivante lorsque je compile ceci:

<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);

         ^~~

Je pense que la variable ( clr) à laquelle je passe func(unsigned int&)est une valeur l. Je peux obtenir l'adresse de clret lui attribuer une autre valeur. Pourquoi cela se transforme-t-il en valeur lorsque j'essaie de le transmettre func(unsigned int&)?

Koen
la source
5
Demandez-vous: est-ce enumun unsigned int?
NathanOliver
@ NathanOliver-ReinstateMonica À mon avis d'origine, je pense que ce typedef enumn'est pas un type natif, et C ++ le traiterait comme un unsigned inttype.
Koen
1
Le message d'erreur de GCC n'est pas optimal dans ce cas. Clang donnera un message moins déroutant en imprimant le type d'origine de clr.
cpplearner
@cpplearner yep, c'est pourquoi je pensais que c'était enum typecomme unsigned inten C ++.
Koen
enum Xest son propre type, distinct deint
MM

Réponses:

22

clrlui-même est une valeur de type Color. Mais la fonction n'accepte pas a Color. Il accepte un (référence à) unsigned int. Ainsi, l'argument est converti (implicitement). Et le résultat de la conversion est une valeur de type unsigned int.

eerorika
la source
1
Oui, j'essaye func(Color&)avant de poser la question, et ça se passe bien. Je pensais juste que C ++ traiterait le enumtype comme un unsigned inttype lors de la compilation. Merci pour votre réponse.
Koen
Une chose qui ajoute à la confusion est que C est presque un sous-ensemble parfait de C ++. Au moins, tout ce que vous pouvez faire en C, vous pouvez le faire en C ++ avec du code presque identique, en particulier sur gcc / clang. Vous aurez également besoin de constructions dépendantes du compilateur comme remplacement C ++ pour «restreindre» en C fourni par gcc. Les énumérations sont différentes en C et C ++, par exemple, si someColor est enum, 'someColor = 1' est C légal, mais pas C ++.
Erik Alapää
0

le type enum init et l'affectation doivent être enum à l'intérieur en donc le type enum ne peut pas être lvalue。 void func (unsigned int & num) cette fonction a besoin du type quote

Superman
la source
Si je passe func(unsigned int&)à func(Color&), le compilateur l'accepte. Je pense donc que la variable de type enum est une valeur l.
Koen
non, car le type enum ne peut pas affecter l'affectation int enum à l'extérieur
superman
Tu veux dire que c'est toujours une valeur? Mais je lui associe une référence de valeur non constante func(Color&)et ça passe.
Koen
oui , il a toujours une valeur , func (couleur et touche) cette fonction touche param uniquement affectation ROUGE, VERT, BLEU, Sinon cela produira une erreur。
superman
vous pouvez voir ces instructions cpp
superman