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


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.


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


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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.