2017-07-10 84 views
4

为什么下面的代码没有任何错误地编译?为什么我允许使用不完整的枚举类?

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

的可能的复制[?为什么是枚举类的临时允许用任意值的初始化(https://stackoverflow.com/questions/30852922/why-is- enum-class-temporaries-with-arbitrary-values-allowed) – anatolyg

+1

有没有理由不应该这样做? –

+6

您已决定a:_“不透明枚举声明:定义枚举类型但不枚举:在此声明之后,该类型是完整类型并且其大小已知。”_ source:http://en.cppreference.com/w/cpp/language/enum –

回答

5

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

你看它明确使用的语法如下:

enum class Enumeration : short; 

编译器知道一切有了解的EnumerationEnumeration不透明枚举声明,这意味着该类型也是complete,即您可以使用sizeof。如果需要,您可以在稍后的重新声明中指定列举者列表(除非重新声明显然带有不同的基础类型)。

请注意,由于您使用的是enum class,因此使用static_cast是强制性的。

  • 强类型枚举不允许隐式转换int,但你可以放心地使用static_cast他们来检索他们的积分值。

毕竟他们还是enum

Quoting cppreference

有从作用域 枚举积分类型的值的隐式转换,尽管的static_cast可以用于 获得枚举的数值。

更多关于这个话题在这里:How to automatically convert strongly typed enum into int?

相关问题