Чому тут змінна 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&)- це значення. Я можу отримати адресу clrі можу призначити їй інше значення. Чому він перетворюється на ревальвію, коли я намагаюся передати його func(unsigned int&)?


5
Запитайте себе: це enuma unsigned int?
НатанОлівер

@ NathanOliver-ReinstateMonica На мою оригінальну думку, я думаю, що typedef enumце не рідний тип, і C ++ насправді трактував би це як unsigned intтип.
Коен

1
Повідомлення про помилку GCC у цьому випадку є неоптимальним. Кланг видасть менш заплутане повідомлення, надрукувавши оригінальний тип clr.
cpplearner

@cpplearner так, тому я вважав, що enum typeце стосується як unsigned intу C ++.
Коен

enum Xце власний тип, відмітний відint
ММ

Відповіді:


22

clrсама по собі є значенням типу Color. Але функція не приймає a Color. Він приймає (посилання на) unsigned int. Отже, аргумент перетворюється (неявно). І результат перетворення - це первинне значення типу unsigned int.


1
Так, я спробую, func(Color&)перш ніж задати питання, і воно складе пропуск. Я просто думав, що C ++ трактуватиме enumтип як unsigned intтип у складанні. Дякую за вашу відповідь.
Коен

Одне, що додає плутанини, - це те, що C - це майже ідеальний підмножина C ++. Принаймні, все, що можна зробити на C, ви можете робити в C ++ з майже однаковим кодом, особливо на gcc / clang. Також вам знадобляться конструкції, що залежать від компілятора, як заміна C ++ на "обмежувати" в C, що надається gcc. Енуми різні за C і C ++, наприклад, якщо деякийColor є перерахунком, 'someColor = 1' є законним C, але не C ++.
Ерік Алапяа

0

enum тип init та призначення повинні бути enum всередині , тому enum тип не може бути lvalue。 void func (без підпису int & num) для цієї функції потрібен тип котирування


Якщо я перейду func(unsigned int&)до цього func(Color&), компілятор прийме його. Тому я думаю, що змінна типу enum - це значення.
Коен

ні, тому що тип enum не може
superman

Ти маєш на увазі це все-таки ревальвація? Але я пов'язую не-const lvalue посилання на нього в func(Color&), і це передається .
Коен

так , це все-таки оцінюється , функція (Колір та клавіша) ця функція парам-клавіша лише призначення КРАСНА, ЗЕЛЕНА, СІНЬКА, інакше буде помилка。
супермен

ви можете побачити цю інструкцію cpp
superman
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.