将C++枚举类型转换为整数类型后,枚举类型的标志不正确

4
我理解的是,C++枚举类型会根据整数提升进行转换。在整数提升期间,应首先尝试将值转换为int,如果该值无法用int表示,则应使用unsigned int
C++03 conv.prom:
2) .... 枚举类型(7.2)的右值可以转换为以下第一个类型的右值,该类型可以表示枚举中的所有值(即在7.2中描述的范围bmin到bmax中的值):int、unsigned int、long或unsigned long。
但我在VC++2010中的测试结果显示相矛盾:
enum {A1=60, A2=61,A3=63,A4=64,A5=66,A6=0xffffFFF1};
const bool b1 = A6 < A1;
//result b1=true;

A60xffffFFF1,应该是一个无符号值(十进制 4294967281)。由于这个值无法被一个 int 表示,它应该转换为 unsigned int。但显然,在比较中使用时,A6 被转换为了 -15。为什么会这样呢?


1
https://dev59.com/qXVC5IYBdhLWcg3w21Mq - Ashalynd
FYI,在Clang 3.4上它的工作与您预期的一样。 - John Zwinck
我倾向于不同意提供的链接https://dev59.com/qXVC5IYBdhLWcg3w21Mq中的所有答案。枚举是一种没有符号的独特类型。当我们在需要有符号性的上下文中使用它时,我们谈论的是将枚举转换为某个整数类型,这是一种明确定义的操作。这被称为整数提升 - 与枚举的底层类型无关。 - JavaMan
1个回答

3

这是MS VC++的一个错误。我在这里描述了它。

尽管描述是用俄语写的,但您可以使用例如谷歌服务翻译将其翻译成英语。

此外,C++标准本身与枚举相关存在缺陷。我也在这里描述了它。

还有一个关于枚举讨论的参考资料(这次是用英语),可以在这里访问。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接