給定以下C++ 11代碼定義的新類型安全枚舉是否從0開始?
enum class Foods {
Apple,
Pear,
Banana
};
將
std::cout << (unsigned int)Foods::Apple << std::endl;
輸出0?
這對於MSVC 2012和gcc 4.7.0是正確的,但是我對C++ 11標準指定的內容更感興趣。也就是說,便攜式代碼可以依賴於第一項的值默認爲0的枚舉嗎?
給定以下C++ 11代碼定義的新類型安全枚舉是否從0開始?
enum class Foods {
Apple,
Pear,
Banana
};
將
std::cout << (unsigned int)Foods::Apple << std::endl;
輸出0?
這對於MSVC 2012和gcc 4.7.0是正確的,但是我對C++ 11標準指定的內容更感興趣。也就是說,便攜式代碼可以依賴於第一項的值默認爲0的枚舉嗎?
是的,他們是。它在§7.2/ 2中:
[...]如果第一個枚舉器沒有初始化器,則相應常量的值爲零。沒有初始化器的枚舉器定義爲枚舉器提供通過將前一個枚舉器的值增加1而獲得的值。你爲什麼要使用類型安全的枚舉
本節涵蓋enum class
聲明和定期enum
聲明
枚舉值的初始化沒有改變:除非您給出不同的初始值,否則它們將從零開始並從先前的值開始向上計數。相關部分在7.2 [dcl.enum]第2段中:
如果第一個枚舉數沒有初始值設定項,則對應常量的值爲零。沒有初始化器的枚舉器定義爲枚舉器提供通過將前一個枚舉器的值增加1而獲得的值。
當涉及到不指定初始化程序的第一個枚舉數的值時,該標準沒有區分有範圍和無範圍的枚舉。
從§7.2/ 2 [dcl.enum]
僅爲
enum
一個枚舉密鑰聲明的枚舉類型是 無作用域枚舉,其統計員是無作用域統計員。 枚舉鍵enum class
和enum struct
在語義上是等價的; 與這些一個所聲明的一個枚舉類型是作用域 枚舉,其統計員是作用域枚舉。 [...] 如果 第一枚舉沒有初始化,相應 常數的值是零。 [...]
如果你關心自己的整數表示呢? – Pubby
@Pubby,以免不必要地污染命名空間。類型安全枚舉也適用於作用域。除此之外,我比其他任何事都更好奇。 – nixeagle
好吧,三個很好的答案都說同樣的事情。我提高了所有這些,現在我接受了!我想我會接受明天最富有的人。 :) – nixeagle