关于c ++ 11:“枚举类”是C ++中的类类型吗?

Is “enum class” a class type in C++?

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

然后我创建了枚举类,并检查它是否是使用std::is_class的类类型。

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>

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

int main()
{
    std::cout << std::boolalpha;
    std::cout << std::is_class<Enum>::value << '
'
;
}

然后我在Linux平台上用g++编译器编译并运行,它输出false值。

那么,enum类类型是不是?如果枚举是类类型,那么为什么我得到的是假值?


enum class不是class定义-关键字组合用于定义作用域枚举,该枚举是与class完全独立的实体。

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

根据标准:

The enumeration type declared with an enum-key of only enum is an unscoped enumeration, and its enumerators are unscoped enumerators. The enum-keys enum class and enum struct are semantically equivalent; an enumeration type declared with one of these is a scoped enumeration, and its enumerators are scoped enumerators.

在标准中没有提到enum class是"class"类型。


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

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

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

它只允许通过限定名访问枚举器。尽管它没有阻止像真范围枚举那样的隐式转换。

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

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