"enum class"是C++中的类类型吗?

msc*_*msc 41 c++ enums c++11 c++17

我使用cppreference阅读了C++中的枚举声明.

然后我制作了Enum类并检查它是否是类类型或不使用std::is_class.

#include <iostream>

enum class Enum 
{
    red = 1, blue, green
};

int main() 
{
    std::cout << std::boolalpha;
    std::cout << std::is_class<Enum>::value << '\n';
}
Run Code Online (Sandbox Code Playgroud)

然后我在Linux平台上编译并运行G ++编译器,它打印出false值.

所以类型enum不是?如果枚举是一个类类型,那么为什么我会得到值?

Vit*_*meo 46

enum class不是class定义 - 关键字的组合用于定义范围枚举,它是一个完全独立的实体class.

std::is_class正确回到false这里.如果你使用std::is_enum,它将返回true.


从标准:

仅使用枚举键声明的枚举类型enum是未作用域的枚举,其枚举数是未作用域的枚举数.枚举键enum classenum struct语义等价; 使用其中一个声明的枚举类型是作用域枚举,其枚举器是作用域枚举器.

有没有一个提到enum class是一个" class型"的标准的任何地方.

  • "在任何地方都没有提到枚举类是一种类型." 除了用于在代码中声明它的关键字:/ (12认同)

Sto*_*ica 22

尽管有class关键字,但枚举不是类.该关键字仅表示枚举器必须遵守某些范围规则(并且还防止隐式整数转换).

关键字的选择是由于新类型1带来的方面,以及在C++ 11之前的时代如何将范围内的枚举器一起入侵,以获得所述方面:

struct Enum { // could just as well be a class.
  enum {
    red = 1, blue, green
  };
};
Run Code Online (Sandbox Code Playgroud)

其中只允许通过限定名称访问枚举器.虽然它没有阻止像真正的作用域枚举这样的隐式转换.

is_class 用于标识类/结构聚合类型.


1 B. Stroustrup - C++ 11常见问题解答

  • Stroustrup说关于关键字的选择:_"新的枚举是"枚举类",因为它们将传统枚举(名称值)的各个方面与类的方面(作用域成员和缺少转换)结合起来."_(来自[C +] +11 FAQ](http://www.stroustrup.com/C++11FAQ.html#enum)). (3认同)
  • 我怀疑它被称为"枚举类"而不是更明确的东西(例如"范围枚举")的主要原因之一仅仅是关键字重用.向该语言添加新关键字是一个困难的过程,因为它可以打破向后兼容性,这就是为什么"final"不是关键字而是标识符的原因."enum class"非常有意义并且重复使用了现有的关键字,所以他们就这样做了.纯猜想,当然:) (3认同)
  • @AzCopey - 我会把钱投入你的赌注:)我怀疑事实上它恰好与现有的成语有相似之处是一个快乐的巧合. (3认同)