回答
這樣的枚舉在C++標準的第7條第3款中被具體列出爲 不合格。 gcc不接受它。有gcc的一個bug修復此:
我錯過了。語法允許表單,但是在章節標題中,實際上有一個特定的禁止,它不聲明任何類型或實體(變量,函數或引用)。並以此案例爲例。 – 2012-03-20 14:23:49
@Nawaz WeaselFox引用的段落存在於C++ 98,C++ 03和C++ 11中,並且沒有改變,並有這個確切的例子。 – 2012-03-20 14:29:05
據來自C++標準下面的代碼片段,我們可以推斷,這是確實是一個有效的語句:
7.2/1 枚舉聲明(C++ 03)
...
枚舉符:
枚舉標識選擇 {枚舉列表選擇}
注意,無論是標識和枚舉列表是可選的,爲此的語句enum {}
是有效的(如果你問標準)。
但是標準還沒有說空白聲明是不合格嗎?
是的,在標準的下面片段中甚至有一個enum { };
的例子。
/3 說明符(C++ 03)
在這些情況下,每當一類說明符或枚舉說明符是 存在於DECL說明符-SEQ,標識符在這些說明符中, 是聲明中聲明的名稱(類別爲 名稱,枚舉名稱或枚舉器,具體取決於語法)。
在這種情況下,與除了未命名的位字段 (9.6)的聲明,的DECL說明符-SEQ將介紹一個或多個名稱到 該程序,或應當重新聲明引入的名稱由之前的 聲明。
*實施例[
enum { }; // ill-formed
typedef class { }; // ill-formed
*端示例]
結論
聲明似乎是病雖然編譯器是由人類編寫的 - 人類傾向於犯錯誤,有時忽略了一些東西,但仔細觀察標準後形成的。
TL; DR你不應該使用空聲明,如enum { };
,即使它
但是正如WeaselFox所指出的那樣,在§7/ 3中有一個用於__all__聲明的通用語義約束, ,它有效地禁止聲明 ,這些聲明不聲明任何東西。它給出的一個例子是'enum {};'。 – 2012-03-20 14:34:09
@JamesKanze回答更新,謝謝你的提醒,我完全忘了'7.1/3'。 – 2012-03-20 14:41:47
@refp我也錯過了,直到WeaselFox指出它。 ( 部分是§7/ 3,而不是§7.1/ 3。) – 2012-03-20 14:46:55
- 1. 是否有可能在enum中枚舉枚舉?
- 2. C#枚舉 - 是否爲空?
- 3. __COUNTER__宏是否可移植?
- 4. 是否是可移植的查詢?
- 5. Enum裏面枚舉的C++
- 6. 是否可以創建泛型枚舉?
- 7. Dapper是否支持枚舉?
- 8. 是否需要枚舉string.ToCharArray()?
- 9. 如何可移植是C++?
- 10. 在枚舉中枚舉是否有一個通用的方法?
- 11. 是枚舉Java中的枚舉
- 12. Enum不是枚舉映射的有效類型
- 13. `typedef enum {} t`是否允許C++ 0x中的範圍枚舉元素標識符?
- 14. 的Java:訪問常量枚舉(ENUM)
- 15. Gtk#是否有鍵值的枚舉?
- 16. 是否有類似Python的枚舉linq
- 17. 空枚舉6
- 18. 是否有可能有兩個或多個單詞枚舉枚舉類?
- 19. 是否可以將非枚舉值作爲枚舉函數參數傳遞?
- 20. C#枚舉如何檢查枚舉中是否存在描述
- 21. 解析爲可空枚舉
- 22. 可空枚舉(??)和LinqToSQL
- 23. 通用可爲空枚舉
- 24. 枚舉拋出「不是枚舉類型」
- 25. 如何在Enum中嵌套枚舉值
- 26. 跨機器的可移植jndi語法(EJB3.1)是否可用?
- 27. 空類而不是枚舉 - 可怕的想法?
- 28. 是否可以將枚舉屬性的空值存儲到數據庫中?
- 29. 是否可以使用方法創建一個空的Java枚舉類型?
- 30. C++枚舉不是
你在使用它的編譯? – Cameron 2012-03-20 14:18:42
在一個宏可能有一個空參數 – 2012-03-20 14:46:44
這不僅僅是一個空的枚舉,它是一個匿名的空枚舉,如其他答案中所述,它是不合格的,因爲它沒有聲明任何東西。所以,空的枚舉是valids,這是無效的匿名空枚舉。你可以聲明'enum {A}'和'enum e {}',這是有效的聲明。 – 2017-09-14 21:07:20