gpt4 book ai didi

c++ - C++11 中的最终枚举类

转载 作者:可可西里 更新时间:2023-11-01 18:31:01 30 4
gpt4 key购买 nike

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

考虑代码:

#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) 中提及?

最佳答案

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 {
...
};

不是标准形式。

关于c++ - C++11 中的最终枚举类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39223309/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com