C++ C++;带有显式值的枚举类 使用正常 EnUM,使用显式值避免枚举的中间插入是一种很好的做法。这非常重要,因为枚举项可以隐式转换为整数

C++ C++;带有显式值的枚举类 使用正常 EnUM,使用显式值避免枚举的中间插入是一种很好的做法。这非常重要,因为枚举项可以隐式转换为整数,c++,C++,那么枚举类呢?设定明确的价值观仍然是一种好的做法,还是这只是一种“过时”的行为 例如: 它与枚举类相同,只添加了类型安全性和其值的位置性(您需要使用限定名)。如果我正确理解您的问题,您指的是二进制兼容性。在过去,当您无法向前声明枚举时,您会看到如下内容: //Some header enum Animal { AnimalDog = 0, AnimalCat = 1 }; // Some other header, not #including the previous one

那么
枚举类
呢?设定明确的价值观仍然是一种好的做法,还是这只是一种“过时”的行为

例如:


它与枚举类相同,只添加了类型安全性和其值的位置性(您需要使用限定名)。

如果我正确理解您的问题,您指的是二进制兼容性。在过去,当您无法向前声明枚举时,您会看到如下内容:

//Some header
enum Animal
{
    AnimalDog = 0,
    AnimalCat = 1
};

// Some other header, not #including the previous one    
void func(int an_animal); // Accepts an Aninal enum
当然,如果枚举发生了变化,那么出于二进制兼容性的考虑,在枚举的末尾添加新的枚举数是非常重要的

//Some header
enum class Animal
{
    Dog = 0,
    Cat = 1
};

// Some other header, not #including the previous one    
enum class Animal;
void func(Animal);
它是否随作用域枚举而更改?好的,是和否。您可以向前声明一个作用域枚举

//Some header
enum class Animal
{
    Dog = 0,
    Cat = 1
};

// Some other header, not #including the previous one    
enum class Animal;
void func(Animal);
因此,现在您添加了一些类型安全性和作用域,以避免名称空间污染。但关于二进制兼容性的考虑同样适用


所以我会说是的。也要继续使用作用域枚举。

在您发布的代码片段中,不需要为枚举器提供显式值,无论它是
枚举
还是
枚举类
。只给枚举数中的一些显式值可能是不安全的,但不给它们任何值都是安全的

参考文献中的MISRA C++指南建议,所有枚举者或所有枚举者都不必给出明确的值,但即使是相当严格的限制,也只有合理的和安全的用例才对某些枚举值给出值。


所有这些在
enum
enum类
之间都没有区别。其中一个安全的东西在另一个安全。

我认为可读性才是真正重要的。如果您需要特定的值,或者出于某种原因不希望这些值在软件版本之间更改,请使用显式值。如果你需要“公正的价值”,使用隐式,因为它可以更清楚地表达你的意图。设置显式价值没有错:在某些情况下,这是获得所需行为的唯一途径。有关
enum
enum类的比较,请参见以下内容: