2016-08-30 47 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