msc*_*msc 41 c++ enums c++11 c++17
我使用cppreference阅读了C++中的枚举声明.
然后我制作了Enum类并检查它是否是类类型或不使用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';
}
Run Code Online (Sandbox Code Playgroud)
然后我在Linux平台上编译并运行G ++编译器,它打印出false值.
所以类型是enum不是?如果枚举是一个类类型,那么为什么我会得到假值?
Vit*_*meo 46
enum class不是class定义 - 关键字的组合用于定义范围枚举,它是一个完全独立的实体class.
std::is_class正确回到false这里.如果你使用std::is_enum,它将返回true.
从标准:
仅使用枚举键声明的枚举类型
enum是未作用域的枚举,其枚举数是未作用域的枚举数.枚举键enum class和enum struct语义等价; 使用其中一个声明的枚举类型是作用域枚举,其枚举器是作用域枚举器.
有没有一个提到enum class是一个" class型"的标准的任何地方.
Sto*_*ica 22
尽管有class关键字,但枚举不是类.该关键字仅表示枚举器必须遵守某些范围规则(并且还防止隐式整数转换).
关键字的选择是由于新类型1带来的方面,以及在C++ 11之前的时代如何将范围内的枚举器一起入侵,以获得所述方面:
struct Enum { // could just as well be a class.
enum {
red = 1, blue, green
};
};
Run Code Online (Sandbox Code Playgroud)
其中只允许通过限定名称访问枚举器.虽然它没有阻止像真正的作用域枚举这样的隐式转换.
is_class 用于标识类/结构聚合类型.
1 B. Stroustrup - C++ 11常见问题解答