2009-10-26 41 views
6
namespace ValueType { 
    enum Enum { 
    Boolean = 0, 
    Float = 1, 
    Double, 
    SInt = 8, 
    SLong, 
    UInt = SInt + (1 <<4), 
    ULong = SLong + (1 << 4) 
    }; 
} 
+0

我甚至不知道这是法律......整齐 – 2009-10-26 21:52:34

+3

这不是真正的自我指涉。您有一些成员引用了以前定义的成员。这里的规则是正常的 - 一旦定义,它就是可见的。 – 2009-10-26 21:58:05

+0

我更新了问题以反映您的观点。谢谢。 :) – Geoff 2009-10-26 22:11:39

回答

12

是的 - 要求是它是一个积分常量表达式。 C++标准包括以下示例:

enum { d, e, f=e+2 }; 
+0

当我看到你的答案和Pavel的上述内容时,我立即想起了提升和元编程,我怎么不记得那些?嘿嘿。 谢谢。 :) – Geoff 2009-10-26 22:07:29

+0

甚至可以使用布尔值:** enum {yes = true,no =!yes}; ** – fmuecke 2009-10-26 23:01:31

+0

是的,根据C++的规则,*整型*包括“bool,char,wchar_t,有符号和无符号整数类型“和”布尔值表现为整数类型“。 – 2009-10-26 23:45:32

1

正如Jerry指出的那样,这是合法的。

在一些罕见的情况下,它意识到只有在完全定义枚举后才指定枚举器的类型。该标准说明了关于枚举类型(7.2/4)的以下内容:

每个枚举都定义了一种与所有其他类型不同的类型。在enum-specifier的大括号之后,每个枚举器都有其枚举类型。在大括号之前,每个枚举数的类型是其初始化值的类型。如果为枚举器指定了初始化程序,则初始化值的类型与表达式的类型相同。 如果没有为第一个枚举器指定初始化器,则该类型是未指定的整数类型。否则,类型与前一个枚举器的初始化值的类型相同,除非增加的值不能用该类型表示,在这种情况下,类型是一个未指定的整数类型,足以包含递增的值。

高亮显示的句子可以在下面的例子中被显示:

enum E { 
    E0   // Unspecified type 
    , E1 = E0-1 // -1, or MAX_UINT 
    , E2   // 0 or (MAX_UINT+1) 
}; 

基本上,选择用于E0类型影响所得的E1值。

+0

可以理解且合乎逻辑,我不明白为什么有人会避免给出初始值。这样做会毫无意义地让你处于编译器实现的摆布之中。例如:在MSVC 2008中,E产生:E0(0),E1(-1),E2(0)。 – Geoff 2009-10-27 18:05:11

+0

与所有这类行为一样,人们有时会认为编译器会做出明智的做法。当然,明智的是他们希望发生的事情。 – 2009-10-27 18:12:13