为什么枚举类比普通枚举更受欢迎?

新手上路,请多包涵

我听说一些人建议在 C++ 中使用枚举 _类_,因为它们的 类型安全

但这究竟意味着什么?

原文由 Oleksiy 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 338
2 个回答

C++有两种 enum

  1. enum class es
  2. 纯色 enum s

以下是一些关于如何声明它们的示例:

  enum class Color { red, green, blue }; // enum class
 enum Animal { dog, cat, bird, human }; // plain enum

两者有什么区别?

  • enum class es - 枚举器名称是枚举的 本地 名称,并且它们的值 不会 隐式转换为其他类型(如另一个 enumint

  • 普通 enum s - 其中枚举数名称与枚举在同一范围内,并且它们的值隐式转换为整数和其他类型

例子:

 enum Color { red, green, blue };                    // plain enum
enum Card { red_card, green_card, yellow_card };    // another plain enum
enum class Animal { dog, deer, cat, bird, human };  // enum class
enum class Mammal { kangaroo, deer, human };        // another enum class

void fun() {

    // examples of bad use of plain enums:
    Color color = Color::red;
    Card card = Card::green_card;

    int num = color;    // no problem

    if (color == Card::red_card) // no problem (bad)
        cout << "bad" << endl;

    if (card == Color::green)   // no problem (bad)
        cout << "bad" << endl;

    // examples of good use of enum classes (safe)
    Animal a = Animal::deer;
    Mammal m = Mammal::deer;

    int num2 = a;   // error
    if (m == a)         // error (good)
        cout << "bad" << endl;

    if (a == Mammal::deer) // error (good)
        cout << "bad" << endl;

}

结论:

enum class es 应该是首选,因为它们会减少可能导致错误的意外。

原文由 Oleksiy 发布,翻译遵循 CC BY-SA 4.0 许可协议

值得注意的是,除了这些其他答案之外,C++20 还解决了 enum class 存在的问题之一:冗长。想象一个假设的 enum classColor

 void foo(Color c)
  switch (c) {
    case Color::Red: ...;
    case Color::Green: ...;
    case Color::Blue: ...;
    // etc
  }
}

与普通的 enum 变体相比,这是冗长的,其中名称在全局范围内,因此不需要前缀 Color::

但是,在 C++20 中,我们可以使用 using enum 将枚举中的所有名称引入当前作用域,从而解决问题。

 void foo(Color c)
  using enum Color;
  switch (c) {
    case Red: ...;
    case Green: ...;
    case Blue: ...;
    // etc
  }
}

所以现在,没有理由不使用 enum class

原文由 themeeman 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏