代码是:
//正确
enum StudentNames
{
KENNY, // 0
KYLE, // 1
STAN, // 2
BUTTERS, // 3
CARTMAN, // 4
WENDY, // 5
MAX_STUDENTS // 6
};
int main()
{
int testScores[MAX_STUDENTS]; // allocate 6 integers
testScores[STAN] = 76; // still works
return 0;
}
//不正确:给出编译时错误
enum class StudentNames
{
KENNY, // 0
KYLE, // 1
STAN, // 2
BUTTERS, // 3
CARTMAN, // 4
WENDY, // 5
MAX_STUDENTS // 6
};
int main()
{
int testScores[StudentNames::MAX_STUDENTS]; // allocate 6 integers
testScores[StudentNames::STAN] = 76;
}
然后再次更正为:
namespace StudentNames
{
enum StudentNames
{
KENNY, // 0
KYLE, // 1
STAN, // 2
BUTTERS, // 3
CARTMAN, // 4
WENDY, // 5
MAX_STUDENTS // 6
};
}
int main()
{
int testScores[StudentNames::MAX_STUDENTS]; // allocate 6 integers
testScores[StudentNames::STAN] = 76;
}
因为,枚举在内部作为整数实现。为什么在第二种情况下会出现错误?
添加命名空间如何纠正它?
enum class
与enum
不同。
如果你有一个enum class
,那么你的值不是int
类型(尽管它们有一个整数表示)。您不能将它们隐式转换为任何其他类型,甚至不能转换为其他enum
。这是一件好事;它允许您定义类型安全的枚举。(如果要将它们用作int
,则可以使用显式转换。
第二个命名空间编译。这是enum
声明中没有class
。
如果确实要使用 enum class
的值作为 int
s,则需要显式转换:
int main() {
int testScores[int(StudentNames::MAX_STUDENTS)]; // allocate 6 integers
testScores[int(StudentNames::STAN)] = 76;
// ...
}
但我不建议使用该代码,因为enum class
的全部意义在于指示枚举值不应用作整数。
(进行转换是有原因的,但应该很少见。例如,虽然您可以使用由enum class
索引的std::map
,但效率会很低。另一方面,一个典型的enum class
成员很少,效率低下可能不如清晰度那么重要。请注意,您不能使用 std::unordered_map
,因为虽然enum class
值是可比较的,但它们是不可哈希的。