将我的双手绑在enum
上时,我发现:
enum
不能被分配任何文字(甚至是整数类型)。
enum sign{alpha,beta};
alpha=4; //error: lvalue required as left operand of assignment
对此,我无法理解enum
不是左值,因为它具有名称(标识符)。
枚举类型的对象只能由其一个枚举器或具有相同枚举类型的另一个对象初始化或分配。
在示例中还显示:
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
但是为什么在分配正确值时,我得到的都是相同的lvalue
错误,该错误显示在点 1 上。
答案 0 :(得分:1)
您可以在枚举器列表内而不是在其外部初始化枚举器:
enum sign { alpha = 4, beta };
alfa
不是“枚举类型的对象” ,它是enumerator。如果您有:
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};
,因为您实际上不能将枚举作为另一个枚举的基础类型。
此SO帖子中有关该主题的更多信息:
Why can't I have an enum as the underlying type of another enum?
答案 1 :(得分:1)
仅仅是因为某些东西具有名称,并不意味着它就是一个左值。比这更复杂。例如,类型有名称,而根本不是值!您可能正在考虑使用变量名称的表达式,这些表达式的确是左值。但是枚举器不是变量。
枚举器不仅是常量,而且还是 prvalues ,因此错误消息不仅正确无误,而且措词也正确。
您可以阅读有关value categories on cppreference.com的信息。
如果您的书说var2A=var2B
有效,那么您将需要一本新书,因为那是胡扯。但是引用的段落不支持您的主张。就是说,您可以创建一个全新的sign
并从诸如sign mySign = var2A;
之类的任何枚举中对其进行初始化。
答案 2 :(得分:0)
完成时
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
则不适用,但其他情况下,int
#define
和枚举器常量基本上可以互换。)