Почему переменная enum здесь является значением?

12

Пример:

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

Koen
источник
5
Спросите себя: enumэто unsigned int?
Натан Оливер
@ NathanOliver-ReinstateMonica По моему первоначальному мнению, я typedef enumне являюсь нативным типом, и C ++ будет рассматривать его как unsigned intтип действительно.
Коэн
1
В этом случае сообщение об ошибке GCC является неоптимальным. Clang даст менее запутанное сообщение, напечатав оригинальный тип clr.
cpplearner
@cpplearner Да, именно поэтому я подумал, enum typeчто рассматривать как unsigned intв C ++.
Коен
enum Xэто его собственный тип, отличный отint
ММ

Ответы:

22

clrсам по себе является lvalue типа Color. Но функция не принимает Color. Он принимает (ссылка на) unsigned int. Итак, аргумент преобразуется (неявно). И результатом преобразования является значение типа unsigned int.

eerorika
источник
1
Да, я пытаюсь, func(Color&)прежде чем я задам вопрос, и он скомпилируется. Я просто думал, что C ++ будет рассматривать enumтип как unsigned intтип при компиляции. Спасибо за Ваш ответ.
Коэн
Одна вещь, которая добавляет путаницу, - то, что C - почти прекрасное подмножество C ++. По крайней мере, все, что вы можете делать в C, вы можете делать в C ++ с почти идентичным кодом, особенно в gcc / clang. Вам также понадобятся зависимые от компилятора конструкции в качестве замены C ++ для «restrict» в C, предоставляемой gcc. Перечисления различаются в C и C ++, например, если someColor является enum, то someColor = 1 является допустимым C, но не C ++.
Эрик Алапяя
0

Тип enum init и assign должны быть в enum внутри ,, поэтому тип enum не может иметь значение lvalue。 void func (unsigned int & num) для этой функции требуется тип кавычки

сверхчеловек
источник
Если я изменю func(unsigned int&)на func(Color&), компилятор примет это. Поэтому я думаю, что переменная типа enum является lvalue.
Коен
нет, потому что тип enum не может присваивать int enum define outside
супермен,
Ты имеешь в виду это все еще значение? Но я привязываю к нему неконстантную ссылку на значение func(Color&), и оно проходит.
Коен
да , это все еще r-значение , func (Цвет и клавиша) эта функция только назначение клавиши параметра КРАСНЫЙ, ЗЕЛЕНЫЙ, СИНИЙ, в противном случае произойдет ошибка。
супермен
Вы можете увидеть эту инструкцию cpp
супермен