我想老式的改变enum来enum 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”
这就是特点。范围枚举不能隐式转换为整数,因此您不能使用它们代替整数。它们是设计上强类型的。如果您想要隐式转换,请使用无作用域的枚举。
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。允许向前声明类型。