为什么这里的枚举变量是右值?


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
问问自己:是的enum一个unsigned int
NathanOliver,

@ NathanOliver-ReinstateMonica以我的原始观点,我认为typedef enum这不是本机类型,C ++ unsigned int确实会将其视为类型。
科恩(Koen)

1
在这种情况下,GCC的错误消息不是最理想的。Clang会通过打印原始类型的来给出一个不太混乱的消息clr
cpplearner

@cpplearner是的,这就是为什么我认为enum type将其视为unsigned intC ++。
科恩(Koen)

enum X是它自己的类型,与int
MM

Answers:


22

clr本身是类型的左值Color。但是该函数不接受Color。它接受(引用)unsigned int。因此,该参数被转换(隐式)。转换的结果是的prvalue类型unsigned int


1
是的,我func(Color&)先问这个问题,然后编译通过。我只是认为C ++ 在编译时会将enum类型视为unsigned int类型。感谢您的回答。
科恩(Koen)

使混乱增加的一件事是C几乎是C ++的完美子集。至少,您可以用C做的任何事情,都可以用几乎相同的代码在C ++中做,尤其是在gcc / clang上。您还需要依赖于编译器的结构,以代替gcc提供的C语言中“ restrict”的C ++。枚举在C和C ++中是不同的,例如,如果someColor是枚举,则“ someColor = 1”是合法的C,但不是C ++。
ErikAlapää

0

枚举类型初始化和赋值必须在枚举内部,所以枚举类型不能为左值。void func(unsigned int&num)此函数需要引用类型


如果更改func(unsigned int&)func(Color&),编译器将接受它。所以我认为枚举类型变量是一个左值。
科恩(Koen)

不,因为枚举类型无法赋值int枚举在外部定义
超人

您是说它仍然是右值?但是我在中绑定了一个非常量左值引用func(Color&),它通过了。
科恩(Koen)

是的,它仍然是一个右值,FUNC(彩色和钥匙)这个功能PARAM键只分配红色,绿色,蓝色,否则会报错。
超人

您可以看到此cpp说明
超人
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.