当我把手绑在enum
上时,我发现:
-
不能为
enum
分配任何文本(即使是整型)。enum sign{alpha,beta}; alpha=4; //error: lvalue required as left operand of assignment
关于这一点,我不明白enum
为什么不是一个左值,因为它有一个名称(标识符)。
- 在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
alpha
和 beta
将分别等同于 0
和 1
,就像 C/C++ 不允许你赋值到 0
或 1
中一样,枚举器常量也是不可分配的。
(除了整数常量之外,enum sign{alpha,beta}
还创建了一个名为 enum sign
的整数类型,调试器可以将其值打印为 alpha
和 beta
,而不仅仅是 0
和 1
,加上枚举器常量尊重范围和 #define
s不尊重,但除此之外int
#define
s 和枚举器常量基本上是可以互换的。