枚举"ghost values":干什么?

Enums "ghost values": what for?

本文关键字:干什么 values ghost 枚举      更新时间:2023-10-16

我最近注意到一个让我很惊讶的事实:显然,您可以从enum类型检索任何任意值,并将其分配给enum变量,即使它不是enum定义的一部分(我称之为"鬼值")。该变量仅取对应的整数值。

的例子:

#include <iostream>
enum myEnumType { ONE = 1, TWO = 2, THREE = 3 };
int main () {
    myEnumType e;
    e=myEnumType(8);
    std::cout << e << std::endl;
}

输出8

我本以为这是不可能的,因为在我看来,它与枚举类型的约束函数不一致。这样做的原因是什么,最重要的是,它可能的效用是什么?

允许将int转换为enum。c++ 11引入了"枚举类"或"强枚举"或"作用域枚举"来处理这些问题。

其他好处包括它们的作用域和允许前向声明。

Stroustrup的页面上有很多细节,他特别提到了传统枚举的三个问题:
  • 常规枚举隐式转换为int,当某人不希望枚举作为整数时导致错误。
  • 常规枚举将其枚举数导出到周围的作用域,从而导致名称冲突。
  • 不能指定枚举的基础类型,这会导致混淆、兼容性问题,并且无法进行前向声明。

您正在调用传递8的enum的构造函数,因此分配给该实例的值为8。

当你调用enum的默认构造函数时也会发生同样的事情,它将0设置为默认值。

myEnumType e = myEnumType();
std::cout << e << std::endl; // prints 0

它打印0(尽管enum只初始化为ONE = 1, TWO = 2, THREE = 3),这里更好地解释:http://lifecs.likai.org/2010/07/c-enum-default-constructor.html