왜 열거 형 변수가 rvalue입니까?


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다른 값을 할당 할 수 있습니다. 전달하려고 할 때 왜 rvalue로 변 func(unsigned int&)합니까?


5
자신에게 물어 :가 enumA가 unsigned int?
NathanOliver

@ NathanOliver-ReinstateMonica 원래 의견으로는 필자 typedef enum는 네이티브 유형이 아니며 C ++은 unsigned int실제로 유형으로 취급합니다 .
Koen

1
이 경우 GCC의 오류 메시지는 차선책입니다. Clang은 원본 유형을 인쇄하여 혼동을 줄입니다 clr.
cpplearner

@cpplearner yep, 이것이 C ++에서 enum type와 같이 취급되는 이유 unsigned int입니다.
Koen

enum X자신의 유형에서 구별된다int
MM

답변:


22

clr자체는 유형의 lvalue입니다 Color. 그러나 함수는를 허용하지 않습니다 Color. 그것은 (참조)를 받아들 unsigned int입니다. 따라서 인수는 (암시 적으로) 변환됩니다. 그리고 변환의 결과는 유형의 prvalue입니다 unsigned int.


1
그래, 나는 func(Color&)질문을하기 전에 시도 하고 컴파일 패스. 방금 C ++이 컴파일에서 enum유형을 unsigned int유형으로 취급한다고 생각 했습니다. 답변 주셔서 감사합니다.
Koen

혼란을 더하는 한 가지는 C가 거의 C ++의 완벽한 하위 집합이라는 것입니다. 적어도 C에서 할 수있는 모든 것, 특히 gcc / clang에서 거의 동일한 코드로 C ++에서 할 수 있습니다. gcc가 제공하는 C에서 '제한'을 C ++로 대체 할 때 컴파일러 종속 구문도 필요합니다. 열거 형은 C와 C ++에서 다릅니다. 예를 들어 someColor가 열거 형인 경우 'someColor = 1'은 유효한 C이지만 C ++은 아닙니다.
Erik Alapää

0

enum 타입 init과 할당은 enum 안에 있어야합니다. 따라서 enum 타입은 lvalue 일 수 없습니다. void func (unsigned int & num)이 함수는 인용 타입이 필요합니다


로 변경 func(unsigned int&)하면 func(Color&)컴파일러에서 승인합니다. 그래서 열거 형 변수는 lvalue라고 생각합니다.
Koen

아니, enum 타입은 int enum이 외부에서 정의 할 수 없기 때문에
superman

여전히 rvalue를 의미합니까? 그러나 const가 아닌 lvalue 참조를에 바인딩하고 func(Color&)전달합니다.
Koen

그렇습니다, 그것은 여전히 ​​rvalue, func (Color & key)이 함수 param key only RED, GREEN, BLUE를 할당합니다. 그렇지 않으면 에러가 발생합니다.
superman

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.