Perché una variabile enum è un valore qui?


12

Esempio:

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

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

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

Ottengo il seguente errore quando compilo questo:

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

         ^~~

Penso che la variabile ( clr) a cui passo func(unsigned int&)sia un lvalue. Posso ottenere l'indirizzo clre posso assegnargli un altro valore. Perché si trasforma in un valore quando provo a passarlo a func(unsigned int&)?


5
Chiediti: è un enuma unsigned int?
NathanOliver il

@ NathanOliver-ReinstateMonica Nella mia opinione originale, penso che typedef enumnon sia un tipo nativo, e C ++ lo tratterebbe unsigned intdavvero come un tipo.
Koen,

1
Il messaggio di errore di GCC non è ottimale in questo caso. Clang darà un messaggio meno confuso stampando il tipo originale di clr.
cpplearner,

@cpplearner sì, è per questo che pensavo enum typefosse trattato come unsigned intin C ++.
Koen,

enum Xè il suo tipo, distinto daint
MM

Risposte:


22

clrstesso è un valore di tipo Color. Ma la funzione non accetta a Color. Accetta un (riferimento a) unsigned int. Quindi, l'argomento viene convertito (implicitamente). E il risultato della conversione è un valore di tipo unsigned int.


1
Sì, provo func(Color&)prima di porre la domanda e compila il passaggio. Ho solo pensato che C ++ avrebbe trattato il enumtipo come unsigned inttipo nella compilazione. Grazie per la tua risposta.
Koen,

Una cosa che aggiunge confusione è che C è quasi un sottoinsieme perfetto di C ++. Almeno, tutto ciò che puoi fare in C, puoi farlo in C ++ con un codice quasi identico, specialmente su gcc / clang. Avrai anche bisogno di costrutti dipendenti dal compilatore come sostituto di C ++ per "limitarsi" in C fornito da gcc. Gli enum sono diversi in C e C ++, ad esempio, se someColor è enum, 'someColor = 1' è C legale, ma non C ++.
Erik Alapää,

0

enum type init e assegnazione devono essere enum dentro , quindi il tipo enum non può essere lvalue。 void func (unsigned int & num) questa funzione necessita del tipo di preventivo


Se cambio func(unsigned int&)a func(Color&), il compilatore lo accetta. Quindi penso che la variabile di tipo enum sia un lvalue.
Koen,

no, perché il tipo enum non può essere assegnato a un enum definito all'esterno
superman

Vuoi dire che è ancora un valore? Ma rilevo un riferimento a valori non costanti func(Color&)e passa.
Koen,

sì still è ancora un valore , func (Colore e tasto) questa funzione param tasto assegnazione solo ROSSO, VERDE, BLU, Altrimenti si commetterà un errore。
superman

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.