【问题标题】:Why is an enum variable an rvalue here?为什么枚举变量在这里是右值?
【发布时间】:2019-12-31 07:06: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);

         ^~~

我认为传递给 func(unsigned int&amp;) 的变量 (clr) 是一个左值。我可以得到clr 的地址,并可以为其分配另一个值。为什么当我尝试将它传递给func(unsigned int&amp;) 时它会变成右值?

【问题讨论】:

  • 问问自己:enumunsigned int 吗?
  • @NathanOliver-ReinstateMonica 在我最初的看法中,我认为typedef enum 不是原生类型,C++ 确实会将其视为unsigned int 类型。
  • GCC 的错误信息在这种情况下不是最理想的。 Clang 将通过打印 clr 的原始类型来提供一个不那么令人困惑的消息。
  • @cpplearner 是的,这就是为什么我认为 enum type 在 C++ 中被视为 unsigned int
  • enum X 是它自己的类型,不同于int

标签: c++ c++11 rvalue-reference rvalue lvalue


【解决方案1】:

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

【讨论】:

  • 是的,我在问问题之前尝试func(Color&amp;),它编译通过。我只是认为 C++ 在编译时会将enum 类型视为unsigned int 类型。谢谢你的回答。
  • 增加混淆的一点是,C 几乎是 C++ 的完美子集。至少,你可以用 C 做的任何事情,都可以用几乎相同的代码在 C++ 中做,尤其是在 gcc/clang 上。您还需要依赖编译器的构造作为 gcc 提供的 C 中“restrict”的 C++ 替代品。枚举在 C 和 C++ 中是不同的,例如,如果 someColor 是枚举,则 'someColor = 1' 是合法的 C,但不是 C++。
【解决方案2】:

枚举类型初始化和赋值必须是枚举里面,所以枚举类型不能是左值。 void func(unsigned int& num) 这个函数需要引号类型

【讨论】:

  • 如果我将func(unsigned int&amp;) 更改为func(Color&amp;),编译器会接受它。所以我认为枚举类型变量是一个左值。
  • 否,因为枚举类型不能赋值 int enum 定义外部
  • 你的意思是它仍然是一个右值?但是我在func(Color&amp;) 中绑定了一个非 const 左值引用,它通过了。
  • 是的,还是一个右值,func(Color& key)这个函数param key只赋值RED,GREEN,BLUE,否则会报错。
  • 你可以看到this cpp instructions
猜你喜欢
  • 2015-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多