enum クラスはなぜ単純な enum よりも安全だと考えられるのでしょうか? 質問する

enum クラスはなぜ単純な enum よりも安全だと考えられるのでしょうか? 質問する

型の安全性を理由に、C++ ではenumクラスを使用することを推奨する人が何人かいると聞きました。

しかし、それは実際には何を意味するのでしょうか?

ベストアンサー1

C++ には 2 種類ありますenum:

  1. enum classes
  2. プレーンenums

以下に、宣言方法の例をいくつか示します。

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

この2つの違いは何でしょうか?

  • enum classes - 列挙子の名前は列挙型に対してローカルであり、その値は暗黙的に他の型(別のまたはなど)に変換されません。enumint

  • プレーンなenums - 列挙子の名前が列挙と同じスコープにあり、その値が暗黙的に整数や他の型に変換される

例:

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 を優先する必要があります。

おすすめ記事