4
爲什麼下面的代碼沒有任何錯誤地編譯?爲什麼我允許使用不完整的枚舉類?
enum class Enumeration;
void func()
{
auto enumeration = static_cast<Enumeration>(2);
auto value = static_cast<int>(enumeration);
}
爲什麼下面的代碼沒有任何錯誤地編譯?爲什麼我允許使用不完整的枚舉類?
enum class Enumeration;
void func()
{
auto enumeration = static_cast<Enumeration>(2);
auto value = static_cast<int>(enumeration);
}
它編譯因爲編譯器在編譯時知道的Enumeration
大小(這恰好是空的)。
你看它明確使用的語法如下:
enum class Enumeration : short;
編譯器知道一切有了解的Enumeration
。 Enumeration
是不透明枚舉聲明,這意味着該類型也是complete
,即您可以使用sizeof
。如果需要,您可以在稍後的重新聲明中指定列舉者列表(除非重新聲明顯然帶有不同的基礎類型)。
請注意,由於您使用的是enum class
,因此使用static_cast
是強制性的。
int
,但你可以放心地使用static_cast
他們來檢索他們的積分值。畢竟他們還是enum
。
有從作用域 枚舉積分類型的值的隱式轉換,儘管的static_cast可以用於 獲得枚舉的數值。
更多關於這個話題在這裏:How to automatically convert strongly typed enum into int?
的可能的複製[?爲什麼是枚舉類的臨時允許用任意值的初始化(https://stackoverflow.com/questions/30852922/why-is- enum-class-temporaries-with-arbitrary-values-allowed) – anatolyg
有沒有理由不應該這樣做? –
您已決定a:_「不透明枚舉聲明:定義枚舉類型但不枚舉:在此聲明之後,該類型是完整類型並且其大小已知。」_ source:http://en.cppreference.com/w/cpp/language/enum –