我只是好奇枚举类是否可以是最终的...因为编译器给了我相反的结果。
考虑代码:
#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)中没有提到它?
答案 0 :(得分:7)
final
说明符用于表示无法继承类。由于无法继承enum class
,因此您的案例中使用的final
说明符无用。
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 class
与final
说明符定义为:
enum class some_enums final : char {
...
};
不是标准表格。