枚举在内部作为整数实现.那为什么会给出错误



代码是:

//正确

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值是可比较的,但它们是不可哈希的。

相关内容

最新更新