2016-08-30 86 views
7

我只是好奇一個枚舉類是否可以是最終的......因爲編譯器給我矛盾的結果。C++中的最終枚舉類11

考慮代碼:

#include <iostream> 

enum class some_enums final : char 
{ 
    a = 'a', 
    b = 'b', 
    c = 'c' 
}; 

int main() 
{ 
    some_enums aa = some_enums::a; 
    std::cout << "aa=" << static_cast<char>(aa) << std::endl; 
} 

與Visual Studio編譯這個2015編譯器(http://rextester.com/l/cpp_online_compiler_visual)的作品......然而鏗鏘編譯它(http://rextester.com/l/cpp_online_compiler_clang)給我一個錯誤:

source_file.cpp:3:30: error: expected ';' after top level declarator 
     enum class some_enums final : char 

我沒有看到標準中任何地方的最終枚舉類的痕跡,所以我將功勞歸於鏗鏘...然而爲什麼Visual Studio在這種情況下接受它,儘管它在MSDN中沒有提到(https://msdn.microsoft.com/en-us/library/2dzy4k6e.aspx)?

+5

「enum」對枚舉有什麼影響? – bolov

+2

[enum class](https://msdn.microsoft.com/en-us/library/a6cskb49.aspx)文檔沒有提及它。我懷疑這是一個編譯器錯誤。 – user2079303

+0

另請注意,在C++中,類不能像'char'這樣的內置類型繼承。 – Sergey

回答

7

final說明符用於表示類不能從中繼承。由於enum class不能被繼承,所以在你的情況下使用的final說明符是無用的。

「德式聖誕蛋糕」 從here並且還提及在§7.2/ P1枚舉聲明[dcl.enum] ,一個class enum聲明的形式爲:

enum-key attr(optional) nested-name-specifier(optional) identifier enum-base(optional) ; 
  • enum-key - 的enum一個,(自C++ 11)或enum struct(自C++ 11以來)(自C++ 11以來)
  • attr(C++ 11) - 任意數量的at貢品
  • identifier - 正在聲明的枚舉的名稱。如果存在,並且如果此聲明是重新聲明,則可能在之前爲nested-name-specifier(自C++ 11起):名稱和範圍解析運算符序列::,以範圍解析運算符結尾。該名稱只能在非範型枚舉聲明中省略。
  • enum-base(C++ 11) - 冒號(:),然後是type-specifier-seq,它們命名爲整型(如果它是cv-qualified,則忽略限定)。
  • enumerator-list - 枚舉器定義的逗號分隔列表,每個枚舉器定義都可以簡單地是一個標識符,它將成爲枚舉器的名稱,也可以是具有初始化器的標識符:identifier = constexpr。在任何一種情況下,標識符後面都可以緊跟一個可選的屬性說明符序列。 (自C++ 17以來)。

因此,限定了與enum classfinal爲:

​​

不是標準的形式。

+0

我的想法也是......我只是好奇爲什麼MSVS在沒有提及語法錯誤的情況下啓用它 – fritzone

+0

@fritzone可能有些東西在執行過程中會有誤入歧途。 – 101010