C ++ 11

时间:2016-08-30 09:12:21

标签: c++ c++11 enums final

我只是好奇枚举类是否可以是最终的...因为编译器给了我相反的结果。

考虑代码:

#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)进行编译工作......但是使用clang(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

我在标准中的任何地方都没有看到最终枚举类的痕迹所以我赞美clang ......但是为什么Visual Studio在这种情况下会接受它,尽管在MSDN(https://msdn.microsoft.com/en-us/library/2dzy4k6e.aspx)中没有提到它?

1 个答案:

答案 0 :(得分:7)

final说明符用于表示无法继承类。由于无法继承enum class,因此您的案例中使用的final说明符无用。

来自here“Stollen”,并在§7.2/ p1枚举声明中提及[dcl.enum] class enum声明的格式为:

enum-key attr(optional) nested-name-specifier(optional) identifier enum-base(optional) ;
  • enum-key - enum之一,enum class(自C ++ 11以来)或enum struct(自C ++ 11以来)
  • attr(C ++ 11) - 任意数量属性的可选序列
  • identifier - 正在声明的枚举的名称。如果存在,并且如果此声明是重新声明,则可以在nested-name-specifier之前(自C ++ 11开始):名称序列和范围解析运算符::,以范围解析结束运营商。只能在未作用域的枚举声明中省略该名称。
  • enum-base(C ++ 11) - 冒号(:),后跟一个命名整数类型的type-specifier-seq(如果是cv-qualified,则忽略资格)。
  • enumerator-list - 逗号分隔的枚举器定义列表,每个定义都只是一个标识符,它成为枚举器的名称,或者是带有初始化程序的标识符:identifier = constexpr。在任何一种情况下,标识符可以直接跟随可选的属性说明符序列。 (自C ++ 17起)。

因此,将enum classfinal说明符定义为:

enum class some_enums final : char {
...
};

不是标准表格。