2017-07-10 85 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?

相關問題