赋值到 enum - C/C++ 中所需的左值

  • 本文关键字:C++ enum 赋值 c++ c
  • 更新时间 :
  • 英文 :


当我把手绑在enum上时,我发现:

  1. 不能为enum分配任何文本(即使是整型)。

    enum sign{alpha,beta};
    alpha=4;       //error: lvalue required as left operand of assignment
    

关于这一点,我不明白enum为什么不是一个左值,因为它有一个名称(标识符)。

  1. 在C++入门中,给出了:
枚举类型的对象

只能由其枚举器之一或同一枚举类型的另一个对象初始化或赋值。

它还在一个例子中显示:

enum p1{var1A,var1B};
enum p2{var2A,var2B};
var2A=var1A //Error: var2A is not a p2 enumerator -> as written in the book
var2A=var2B //Correct as per the book

但是为什么在分配正确的值时,我得到的只是第 1 点中显示的相同lvalue错误。

仅仅因为某物有一个名字,并不意味着它是一个左值。这比这更复杂。例如,类型有名称,但它们根本不是值!您可能正在考虑使用变量名称的表达式,这些表达式往往是左值。但枚举器不是变量。

枚举器不仅是常量,而且也是 prvalue,因此错误消息不仅正确,而且措辞正确。

您可以在 cppreference.com 上阅读有关值类别的信息。

如果你的书说var2A=var2B是有效的,你需要一本新书,因为那是无稽之谈。但是引用的段落不支持您的断言。也就是说,您可以创建一个新的sign并从任何这些枚举中初始化它,例如sign mySign = var2A;

您可以在枚举器列表内初始化枚举器,而不是在枚举器列表外部初始化枚举器:

enum sign { alpha = 4, beta };

alfa不是"枚举类型的对象",而是枚举器。如果您有:

sign myenum;

然后myenum将是"枚举类型的对象",然后你可以执行以下操作:

myenum = alpha;

或:

myenum = beta;

如果你真的想走这条路,那么使用作用域枚举(你可以指定其底层类型)和一些 std::underlying_type 魔法作为解决方法:

enum class p1 { var1A, var1B };
enum class p2 : std::underlying_type<p1>::type { var2A = p1::var1A, var1B = var1A};

因为您实际上不能将枚举作为另一个枚举的基础类型。

有关此主题的更多信息,请参阅此帖子:

为什么我不能将一个枚举作为另一个枚举的基础类型?

当你这样做时

enum sign{alpha,beta};

它几乎完全等同于

#define alpha 0
#define beta 1

alphabeta 将分别等同于 01,就像 C/C++ 不允许你赋值到 01 中一样,枚举器常量也是不可分配的。

(除了整数常量之外,enum sign{alpha,beta}还创建了一个名为 enum sign 的整数类型,调试器可以将其值打印为 alphabeta,而不仅仅是 01 ,加上枚举器常量尊重范围和 #define s不尊重,但除此之外int #define s 和枚举器常量基本上是可以互换的。

相关内容

  • 没有找到相关文章

最新更新