我使用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 值?
答案 0 :(得分:46)
enum class
不是class
定义 - 关键字的组合用于定义范围的枚举,它是与class
完全独立的实体
std::is_class
在此处正确返回false
。如果您使用std::is_enum
,则会返回true
。
使用仅
enum
的枚举键声明的枚举类型是未作用域的枚举,其枚举数是未作用域的枚举数。枚举键enum class
和enum 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 子>