为什么不能将 int 类型的枚举类值用作 int

vla*_*sch 0 c++ enum-class

我想老式的改变enumenum class : int 由于其自身范围。

但是编译器抱怨在整数算术中使用这些值。但是为什么 - 因为枚举被显式输入为 int?

例子:

  enum class MsgType : int {
    Output = 1,
    Input  = 2,
    Debug  = 3
  };
  enum class MsgSender : int {
    A = 1,
    B = 2,
    C = 3
  };


  // later in code
  int id = (MsgType::Input << 16) + (MsgSender::A);
Run Code Online (Sandbox Code Playgroud)

产生

错误 C2678:二进制“<<”:未找到采用“MyClass::MsgType”类型的左侧操作数的运算符(或没有可接受的转换)

这对我来说似乎有些不合逻辑。

编辑:
我完全意识到投射它们的可能性。但是如果我不希望它们可以转换,为什么我要将类型指定为int. 特别是如果语法暗示某种“继承自int

Sto*_*ica 6

这就是特点。范围枚举不能隐式转换为整数,因此您不能使用它们代替整数。它们是设计上强类型的。如果您想要隐式转换,请使用无作用域的枚举。

enum MsgType : int {
  Output = 1,
  Input  = 2,
  Debug  = 3
};
enum MsgSender : int {
  A = 1,
  B = 2,
  C = 3
};
Run Code Online (Sandbox Code Playgroud)

范围和基础类型的规范是正交的。

或者,如果您只想定义一些操作,而枚举通常保持强类型,您可以重载适当的运算符来实现这一点

int operator<<(MsgType, int); // etc
Run Code Online (Sandbox Code Playgroud)

但是如果我不希望它们可以转换,为什么我要将类型指定为 int

保证一定的布局。遵循特定的 ABI。允许向前声明类型。