在C++中声明静态枚举和在类中声明枚举的区别

18

当在类声明内定义如下所示的枚举时,static enumenum定义有何区别?

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

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

另外,既然我们正在类中定义类型,那么我们称它们为什么?类比地说,如果我在类中定义一个变量,我们称其为成员变量。


1
你使用的编译器是什么?如果这里使用 static 就没有太多意义,所以我觉得它很难编译通过。 - swalog
如果你正在使用C++11,请考虑使用enum class - Dai
@swalog 我正在使用Visual Studio 2012。你知道我可以在哪里找到正在使用的编译器吗?我看到平台工具集是Visual Studio 2012(v110)。 - user3731622
可能是C++:什么是“static enum”的重复问题。 - phuclv
显示剩余2条评论
2个回答

17

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 就像任何其他静态数据成员一样。


这是一个MSVC错误。从相关的错误报告可以看出,编译器将允许enum声明中使用staticregister存储类说明符。该错误已被标记为已修复,因此可能会在VS2015中提供修复程序。


1
我确实想知道为什么这里的 static 没有应用于此声明中声明的 0 个数据成员集。毕竟,如果您执行了 static enum Items { ... } item;,它将是有效的。 - Brian Bi
@Brian 我不明白你所说的“一组 0 数据成员”是什么意思。要么有数据成员,要么就没有,如果没有,那么存储说明符将应用于什么? - Praetorian
因为要拥有一组0个数据成员,你必须首先创建一个集合。使用“枚举”就像描述如果你要创建一个集合它会是什么样子。但与你的示例不同,它实际上并没有创建任何东西。 - NoseKnowsAll
我找到了标准中正确的引用:“如果存储类说明符出现在声明说明符序列中,则在相同的声明说明符序列中不能有typedef说明符,并且声明的init-declarator-list不得为空(除了在命名空间或全局命名空间中声明的匿名联合体,该联合体应声明为静态(9.5))。" - Brian Bi
当你定义一个枚举、结构体、类或联合时,init-declarator-list是可选的:如果你包括它,则声明1个或多个变量,如果不包括它,则声明0个变量。因此,语法似乎允许将static应用于不声明任何变量/数据成员的枚举声明---如果枚举声明可以声明0个该类型的变量,则为什么不能声明0个静态变量?但标准明确禁止这样做,所以我现在对gcc和clang的正确性感到满意。 - Brian Bi

0

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

编辑:即使是static标签的wiki也有解释。就是关于这个话题的。

编辑2:哦,我误读了你的代码。没有静态枚举。您可以拥有一个枚举类型的静态变量来保存值。


1
枚举不是变量。 - Baum mit Augen
1
是的,但是一个存储状态编码在枚举中的变量是。 - Marcus Müller
1
但他并不是在询问那些。 - Baum mit Augen
@BaummitAugen:1. 很酷的用户名,非常酷。2. 是的,我意识到了我的错误。 - Marcus Müller

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接