【问题标题】:Type-casting enum to integer and vice versa [closed]将枚举类型转换为整数,反之亦然[关闭]
【发布时间】:2013-12-24 14:22:41
【问题描述】:

我有一个枚举

enum MYENUM
{
  VAL_1 = 0,
  VAL_2,
  VAL_3
};

以及两个分别以整数和枚举为参数的函数

void MyIntegerFunction(int integerValue)
{
...
}

void MyEnumFUnction(MYENUM enumValue)
{
...
}

我有两个变量

int intVar = 10;
MYENUM enumVar = VAL_2;

在以下两种情况中,在调用这些函数时进行类型转换是正确的,为什么?

Case#1. MyEnumFUnction(static_cast<MYENUM>(intVar));
Case#2. MyIntegerFunction(static_cast<int>(enumVar));

PS:没有 C++11

【问题讨论】:

  • 你知道你可以尝试这个(有和没有演员),看看编译器说什么?
  • 不要粗鲁,但我的问题不是我是否应该施放。并且编译器没有解释 why 部分(大部分)。
  • MyEnumFUnction,您的名字中有一个大写字母 U。你应该解决这个问题。
  • 我个人认为这个问题/答案很有用且内容丰富。我认为应该重新考虑关闭主题的标准。
  • 我同意@SMGreenfield

标签: c++ casting enums


【解决方案1】:

enumint 是明确的转换(假设 C++ 03 其中enum 基本上是int),将隐式执行没有问题。 intenum 可能是错误的,因为它是一个缩小范围,并不是每个 int 值都是有效的 enum 值。这就是为什么只能将int 转换为enum 的原因。

C++ 11 及更高版本的标准同样适用,但 C++ 11 引入了强类型枚举和特定大小的枚举。
强类型枚举被声明为enum class 而不仅仅是enum,它不能转换为整数或任何其他类型,除非是用户定义的转换运算符或函数,或者暴力破解 (static_cast)。大小的枚举声明如下:enum Colors : char {...}。这个特定枚举的值将具有 char 类型,而不是默认的 int

【讨论】:

  • 如果整数值不对应任何定义的枚举值,static_cast 不会报错。
  • @ontherocks:这正是重点。 static_cast 将通过,但您将留下无效的枚举值。你有责任在施法前进行健全性检查。
  • 所以换句话说,我可以摆脱从 enum 到 int 的强制转换的原因是因为固有的理智。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多