阅读了C++中的枚举声明,c++,c++11,enums,c++17,C++,C++11,Enums,C++17" /> 阅读了C++中的枚举声明,c++,c++11,enums,c++17,C++,C++11,Enums,C++17" />

是";“枚举类”;C+中的类类型+;? 我使用C++ .< /p>阅读了C++中的枚举声明

是";“枚举类”;C+中的类类型+;? 我使用C++ .< /p>阅读了C++中的枚举声明,c++,c++11,enums,c++17,C++,C++11,Enums,C++17,然后我制作了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'; } #包括 枚举类枚举

然后我制作了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';
}
#包括
枚举类枚举
{
红色=1,蓝色,绿色
};
int main()
{

std::cout
枚举类
不是一个
定义-关键字组合用于定义一个作用域枚举,它是一个与
完全独立的实体

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


:

使用仅为
enum
的枚举键声明的枚举类型是非作用域枚举,其枚举数是非作用域枚举数。枚举键
enum class
enum struct
在语义上是等效的;使用其中一个键声明的枚举类型是作用域枚举,其枚举数是作用域枚举统计员


在标准的任何地方都没有提到
枚举类
是“
类型”。

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

关键字的选择取决于新类型1带来的方面,以及在C++11之前的时代,作用域枚举数是如何被黑客攻击在一起以获得上述方面的:

struct Enum { // could just as well be a class.
  enum {
    red = 1, blue, green
  };
};
它只允许通过限定名访问枚举数。尽管它没有像真正的作用域枚举那样阻止隐式转换

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


1.

(有你的例子)不,enum不是一种类类型,即使是与
enum class
一起引入时也是如此。Stroustrup在选择关键字时这样说:“新的enum是“enum class”,因为它们将传统枚举的方面(名称值)与类的方面(范围成员和无转换)结合在一起。”@zett42-不知羞耻地添加到了答案中。谢谢!我怀疑它被称为“枚举类”而不是更明确的东西(如“作用域枚举”)的主要原因之一就是为了重复使用关键字。向语言中添加新关键字是一个困难的过程,因为它会破坏向后兼容性,这就是“最终”的原因例如,不是一个关键词,而是一个标识符。“enum类”毫无意义,并且重复使用了现有的关键词,所以他们就这样做了。当然,纯粹的猜测:)@AzCopey-我会把钱押在你的赌注上:)我怀疑它碰巧与现有的习语有相似之处,这是一个令人高兴的巧合。“在任何地方都没有提到枚举类是一种类类型。”除了代码中用来声明它的关键字:/@will:编辑了我的答案,希望能澄清我的意思。这不是对你的答案的嘲弄,而是对枚举选择的语法的嘲弄……它是语法还是语义?(我的意思不是口语意义上的,如“pedantics”。)我正在研究另一个关于
typename
class
在模板参数上下文中是同义词的问题,例如
enum class EC{};template TC{typedef std::is_class type;};
TC
格式良好,但其
type::value
为false。)似乎“class”是一个关键字(有时?仅?)限定了您所指的类型/上下文。我希望听到它更清楚地表达出来-裁判只会费心描述个别案例。