枚举"幽灵价值":为什么?

时间:2014-05-29 10:39:02

标签: c++ enums

我最近注意到一个对我来说非常令人惊讶的事实: 您显然可以从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

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

2 个答案:

答案 0 :(得分:3)

您被允许将int投射到enum。 C ++ 11引入了“枚举类”或“强枚举”或“范围枚举”来处理这个问题。

其他好处包括其范围和允许前瞻性声明。

Stroustrup的页面上有很多细节,他特别提到了传统枚举的三个问题:

  • 常规枚举隐式转换为int,当有人不希望枚举充当整数时会导致错误。
  • 常规枚举将其枚举器导出到周围的范围,导致名称冲突。
  • 无法指定枚举的基础类型,从而导致混淆,兼容性问题,并且无法进行前瞻声明。

答案 1 :(得分:0)

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

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

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

It prints 0(尽管枚举仅用ONE = 1,TWO = 2,THREE = 3初始化),这里更好地解释:http://lifecs.likai.org/2010/07/c-enum-default-constructor.html