“enum class”是C ++中的类类型吗?

时间:2017-09-25 09:10:08

标签: c++ c++11 enums c++17

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

然后我做了 Enum class 并使用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';
}

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

那么是否为enum类类型?如果枚举属于类类型,那么为什么我会获得 false 值?

2 个答案:

答案 0 :(得分:46)

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

std::is_class在此处正确返回false。如果您使用std::is_enum,则会返回true

From the Standard

  

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

在标准中的任何地方都没有提到enum class&#34; class类型&#34;

答案 1 :(得分:22)

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

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

struct Enum { // could just as well be a class.
  enum {
    red = 1, blue, green
  };
};

只允许通过限定名访问枚举数。虽然它没有像真正的作用域枚举那样阻止隐式转换。

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

<子> 1 B. Stroustrup - C++11 FAQ