Exemplo:
typedef enum Color
{
RED,
GREEN,
BLUE
} Color;
void func(unsigned int& num)
{
num++;
}
int main()
{
Color clr = RED;
func(clr);
return 0;
}
Eu recebo o seguinte erro ao compilar isso:
<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);
^~~
Eu acho que a variável ( clr
) para a qual passo func(unsigned int&)
é um lvalue. Posso obter o endereço clr
e atribuir outro valor a ele. Por que ele se transforma em um rvalue quando tento passar para ele func(unsigned int&)
?
enum
aunsigned int
?typedef enum
não é um tipo nativo, e o C ++ o trataria como umunsigned int
tipo de fato.clr
.enum type
é tratar comounsigned int
em C ++.enum X
é de seu próprio tipo, diferente deint
Respostas:
clr
em si é um lvalue do tipoColor
. Mas a função não aceita aColor
. Ele aceita um (referência a)unsigned int
. Portanto, o argumento é convertido (implicitamente). E o resultado da conversão é um pré-valor do tipounsigned int
.fonte
func(Color&)
antes de fazer a pergunta, e compila o passe. Eu apenas pensei que C ++ trataria oenum
tipo como ounsigned int
tipo na compilação. Obrigado pela sua resposta.tipo de enumeração init e assignment devem ser enumerados dentro; portanto, o tipo de enumeração não pode ser lvalue;
fonte
func(unsigned int&)
parafunc(Color&)
, o compilador aceita. Então eu acho que a variável do tipo enum é um lvalue.func(Color&)
e ela passa.