【问题标题】:C++ declaring static enum vs enum in a classC ++在类中声明静态枚举与枚举
【发布时间】:2015-04-26 18:14:47
【问题描述】:

在如下所示的类声明中定义static enumenum 定义有什么区别?

class Example
{
     Example();
     ~Example();

     static enum Items{ desk = 0, chair, monitor };
     enum Colors{ red = 0, blue, green };
}

另外,既然我们在一个类中定义类型,我们怎么称呼它们?以此类推,如果我在一个类中定义一个变量,我们称它为成员变量。

【问题讨论】:

  • 你用的是什么编译器?如果编译成功,我会感到惊讶,因为 static 在这里没有多大意义。
  • 如果您使用的是 C++11,请考虑使用enum class
  • static 说明符在枚举声明中无效。这不应该编译。
  • @swalog 我正在使用 Visual Studio 2012。你知道我在哪里可以找到正在使用的编译器吗?我看到平台工具集是 Visual Studio 2012 (v110)。
  • @swalog 我打开了 Visual Studio 命令提示符并运行 cl.exe。它说我正在使用 Microsost (R) C/C++ Optimizing Compiler Version 17.00.50727.1 for X86。

标签: c++ class enums static nested


【解决方案1】:

static 不能应用于 enum 声明,因此您的代码无效。

从 N3337,§7.1.1/5 [dcl.stc]

static 说明符只能应用于变量和函数的名称以及匿名联合...

enum 声明不是这些。

您可以创建enum 的实例,并根据需要创建static

class Example
{
     enum Items{ desk = 0, chair, monitor };
     static Items items; // this is legal
};

在这种情况下,items 就像任何其他 static data member


这是MSVC bug;从链接的错误报告看来,编译器将允许在 enum 声明上同时使用 staticregister 存储说明符。该错误已作为修复关闭,因此该修复可能会在 VS2015 中提供。

【讨论】:

  • 我确实想知道,为什么这里的static 不适用于此声明中声明的0 数据成员集。毕竟,如果你做了static enum Items { ... } item;,那就是有效的。
  • @Brian 我不明白您所说的 0 个数据成员集 是什么意思。要么有数据成员,要么没有,如果没有,那么存储说明符适用于什么?
  • 好吧,因为要拥有一组 0 个数据成员,您必须实际创建一个集合开始。使用enum 就像描述如果你要创建一个集合会是什么样子。但是,与您的示例相反,它实际上并没有创造任何东西。
  • nvm,我从标准中找到了正确的引用:“如果存储类说明符出现在 decl-specifier-seq 中,则同一 decl-specifier-seq 中不能有 typedef 说明符并且声明的 init-declarator-list 不得为空(在命名命名空间或全局命名空间中声明的匿名联合除外,应声明为静态(9.5))。”
  • 定义枚举、结构、类或联合时,init-declarator-list 是可选的:如果包含它,则声明 1 个或多个变量,并且如果你不包括它,那么你声明 0 个变量。因此,语法似乎允许 static 应用于未声明任何变量/数据成员的枚举声明——如果枚举声明可以声明 0 类型的变量,那么为什么不能声明 0该类型的静态变量?但是标准明确禁止这样做,所以我现在很满意 gcc 和 clang 是正确的。
【解决方案2】:

static 是一个 C++ 存储说明符。这意味着该类成员的值对于该类的所有实例都是相同的。这里的枚举没什么特别的。

编辑:即使static 标签维基也有解释。正是在这个话题上。

EDIT2:哦,我误读了您的代码。没有静态枚举。您可以拥有一个包含值的枚举类型的静态变量。

【讨论】:

  • enum 没有变量。
  • 是的,但是存储编码在枚举中的状态的变量是。
  • 但他并没有问这些。
  • @BaummitAugen: 1. 很酷的手柄。非常酷。 2. 是的,意识到我的错误。
猜你喜欢
  • 2011-06-01
  • 2014-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多