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


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.


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


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.