Пример:
typedef enum Color
{
RED,
GREEN,
BLUE
} Color;
void func(unsigned int& num)
{
num++;
}
int main()
{
Color clr = RED;
func(clr);
return 0;
}
Я получаю следующую ошибку при компиляции:
<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);
^~~
Я думаю, что переменная ( clr
), которую я передаю, func(unsigned int&)
является lvalue. Я могу получить адрес clr
и могу присвоить ему другое значение. Почему оно превращается в значение, когда я пытаюсь передать его func(unsigned int&)
?
enum
этоunsigned int
?typedef enum
не являюсь нативным типом, и C ++ будет рассматривать его какunsigned int
тип действительно.clr
.enum type
что рассматривать какunsigned int
в C ++.enum X
это его собственный тип, отличный отint
Ответы:
clr
сам по себе является lvalue типаColor
. Но функция не принимаетColor
. Он принимает (ссылка на)unsigned int
. Итак, аргумент преобразуется (неявно). И результатом преобразования является значение типаunsigned int
.источник
func(Color&)
прежде чем я задам вопрос, и он скомпилируется. Я просто думал, что C ++ будет рассматриватьenum
тип какunsigned int
тип при компиляции. Спасибо за Ваш ответ.Тип enum init и assign должны быть в enum внутри ,, поэтому тип enum не может иметь значение lvalue。 void func (unsigned int & num) для этой функции требуется тип кавычки
источник
func(unsigned int&)
наfunc(Color&)
, компилятор примет это. Поэтому я думаю, что переменная типа enum является lvalue.func(Color&)
, и оно проходит.