是“枚举类”在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 class
和enum struct
在语义上是等价的; 使用其中之一声明的枚举types是范围枚举,枚举types是范围枚举器。
标准中没有提到enum class
是“ class
types”的地方。
尽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常见问题