是“枚举类”在C + +类types?

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

然后我做了Enum类,并检查它是否是类types或不使用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值。

那么是不是类的types? 如果枚举是一个类的types,那么为什么我得到错误的价值?

enum class不是一个class定义 – 关键字的组合是用来定义范围枚举 ,这是一个完全独立的实体从一个class

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


从标准 :

枚举types声明一个只有enum的枚举键是一个unscoped枚举,其枚举是非范围的枚举。 枚举键enum classenum struct在语义上是等价的; 使用其中之一声明的枚举types是范围枚举,枚举types是范围枚举器。

标准中没有提到enum classclasstypes”的地方。

尽pipeclass关键字,枚举不是类。 该关键字仅意味着统计员必须遵守某些范围规则(并且还可以防止隐式整体转换)。

关键字的select是由于新的types1所带来的方面,以及在C ++ 11之前的时间范围内调用者是如何入侵的,以获得以下方面:

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

其中只允许通过合格的名称访问的统计员。 虽然它并没有阻止像真正的范围枚举这样的隐式转换。

is_class是为了识别类/结构聚合types。


1 B. Stroustrup – C ++ 11常见问题