为什么我被允许使用不完整的枚举类?

时间:2017-07-10 14:53:31

标签: c++

为什么下面的代码编译没有任何错误?

enum class Enumeration;
void func()
{
    auto enumeration = static_cast<Enumeration>(2);
    auto value = static_cast<int>(enumeration);
}

1 个答案:

答案 0 :(得分:5)

它编译是因为编译器在编译时知道Enumeration的大小(恰好是空的)。

您可以使用以下语法明确地看到它:

 enum class Enumeration : short;

编译器知道有关Enumeration的所有信息。 Enumeration opaque-enum-declaration ,这也意味着该类型为complete,即您可以在其上使用sizeof。如果需要,您可以在以后的重新声明中指定枚举器列表(除非重新声明带有不同的基础类型,显然)。

请注意,由于您使用enum class,因此必须使用static_cast

  • 强类型枚举不允许隐式转换为int,但您可以安全地使用static_cast来检索其整数值。

他们仍然enum毕竟。

Quoting cppreference

  

作用域的值没有隐式转换   枚举器到整数类型,虽然static_cast可能用于   获取枚举器的数值。

有关此主题的更多信息,请访问:How to automatically convert strongly typed enum into int?