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.