¿Por qué una variable enum es un valor r aquí?

12

Ejemplo:

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

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

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

Me sale el siguiente error cuando compilo esto:

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

         ^~~

Creo que la variable ( clr) a la que paso func(unsigned int&)es un valor l. Puedo obtener la dirección de clry puedo asignarle otro valor. ¿Por qué se convierte en un valor r cuando trato de pasarlo func(unsigned int&)?

Koen
fuente
55
Pregúntate: ¿es una enuma unsigned int?
NathanOliver
@ NathanOliver-ReinstateMonica En mi opinión original, creo que typedef enumno es un tipo nativo, y C ++ lo trataría como un unsigned inttipo de hecho.
Koen
1
El mensaje de error de GCC es subóptimo en este caso. Clang dará un mensaje menos confuso al imprimir el tipo original de clr.
cpplearner
@cpplearner sí, por eso pensé que enum typees tratar como unsigned inten C ++.
Koen
enum Xes su propio tipo, distinto deint
MM

Respuestas:

22

clren sí es un valor de tipo Color. Pero la función no acepta a Color. Acepta una (referencia a) unsigned int. Entonces, el argumento se convierte (implícitamente). Y el resultado de la conversión es un valor de tipo unsigned int.

eerorika
fuente
1
Sí, lo intento func(Color&)antes de hacer la pregunta, y compila el pase. Solo pensé que C ++ trataría el enumtipo como unsigned inttipo en la compilación. Gracias por tu respuesta.
Koen
Una cosa que se suma a la confusión es que C es un subconjunto casi perfecto de C ++. Al menos, cualquier cosa que pueda hacer en C, puede hacerlo en C ++ con un código casi idéntico, especialmente en gcc / clang. También necesitará construcciones dependientes del compilador como el reemplazo de C ++ para 'restringir' en C proporcionado por gcc. Las enumeraciones son diferentes en C y C ++, por ejemplo, si someColor es enum, 'someColor = 1' es C legal, pero no C ++.
Erik Alapää
0

el tipo de enumeración init y la asignación deben ser enumeración dentro, por lo que el tipo de enumeración no es lvalue。 void func (unsigned int & num) esta función necesita un tipo de comillas

superhombre
fuente
Si cambio func(unsigned int&)a func(Color&), el compilador lo acepta. Entonces, creo que la variable de tipo enum es un lvalue.
Koen
no, porque el tipo enum no puede asignar int enum define afuera
superman
¿Quieres decir que sigue siendo un valor? Pero ato una referencia de valor no constante en él func(Color&)y pasa.
Koen
sí, sigue siendo un valor, func (Color y tecla) esta función param solo asignación de teclas ROJO, VERDE, AZUL, de lo contrario se producirá un error。
superman
puedes ver estas instrucciones de cpp
superman