【问题标题】:Is "enum class" a class type in C++?“枚举类”是 C++ 中的类类型吗?
【发布时间】:2018-03-06 04:54:28
【问题描述】:

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

然后我制作了枚举类并使用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 是类类型吗?如果 enum 是类类型,那么为什么我会得到 false 值?

【问题讨论】:

标签: c++ c++11 enums c++17


【解决方案1】:

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

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


From the Standard:

使用仅enum 的枚举键声明的枚举类型是无作用域枚举,其枚举数是无作用域枚举数。枚举键 enum classenum struct 在语义上是等价的;用其中之一声明的枚举类型是作用域枚举,它的枚举器是作用域枚举器。

标准中的任何地方都没有提到enum classclass 类型”

【讨论】:

  • “没有提到枚举类是任何地方的类类型。”除了用于在代码中声明它的关键字:/
  • @will:编辑了我的答案,希望能澄清我的意思
  • 这不是对您的回答的嘲讽,而是更多为枚举选择的语法...
  • 是语法还是语义? (我的意思不是口语意义上的,如“迂腐”。)我正在研究另一个问题,即typenameclass 在模板参数的上下文中是同义词,例如enum class EC {}; template&lt;class C&gt; TC { typedef std::is_class&lt;C&gt; type; };TC&lt;EC&gt; 格式正确,但它的 type::value 是错误的。)似乎“类”作为关键字(有时?仅?)限定了您所指的类型/上下文。我很想听听它更好地表达 - 裁判只会费心描述个别案例。
【解决方案2】:

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

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

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

仅允许通过限定名称访问枚举器。虽然它并没有像真正的范围枚举那样阻止隐式转换。

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


1B. Stroustrup - C++11 FAQ

【讨论】:

  • Stroustrup 关于关键字的选择这样说:“新的枚举是“枚举类”,因为它们结合了传统枚举(名称值)的各个方面(范围成员和缺少转化)。”(来自C++11 FAQ)。
  • @zett42 - 无耻地添加到答案中。谢谢!
  • 我怀疑它被称为“枚举类”而不是更明确的东西(例如“作用域枚举”)的主要原因之一只是为了关键字重用。向语言中添加新关键字是一个困难的过程,因为它会破坏向后兼容性,这就是为什么“final”,例如,不是关键字而是标识符的原因。 “枚举类”很有意义,并重新使用了现有的关键字,所以他们就这么做了。当然是纯猜想:)
  • @AzCopey - 我会押注你的赌注 :) 我怀疑它也恰好与现有成语有相似之处是一个快乐的巧合。
猜你喜欢
  • 2015-08-09
  • 1970-01-01
  • 2010-10-14
  • 1970-01-01
  • 1970-01-01
  • 2017-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多