在枚举定义中,将以前定义的成员用作以后成员的一部分是否合法? 名称空间值类型{ 枚举枚举{ 布尔值=0, 浮动=1, 双重的 SInt=8, 长途跋涉, Unt= Snt+(1<p>是),要求是一个积分常量表达式。C++标准包括以下例子: namespace ValueType { enum Enum { Boolean = 0, Float = 1, Double, SInt = 8, SLong, UInt = SInt + (1 <<4), ULong = SLong + (1 << 4) }; } enum { d, e, f=e+2 };
正如他所指出的,这是合法的 在一些罕见的情况下,我们应该意识到,只有在完全定义了枚举之后才指定枚举数的类型。该标准对枚举数的类型(7.2/4)作了如下说明: 每个枚举定义的类型不同于所有其他类型。在枚举说明符的右大括号之后,每个枚举数都有其枚举的类型。在右大括号之前,每个枚举数的类型是其初始化值的类型。如果为枚举数指定了初始值设定项,则初始化值具有与表达式的类型相同。如果没有为第一个枚举数指定初始值设定项,则该类型为未指定的整数类型。否则,该类型与前一个枚举数的初始化值的类型相同,除非递增值在该类型中不可表示,在这种情况下,该类型为未指定类型足以包含递增值的整数类型 突出显示的句子可以在以下示例中显示:在枚举定义中,将以前定义的成员用作以后成员的一部分是否合法? 名称空间值类型{ 枚举枚举{ 布尔值=0, 浮动=1, 双重的 SInt=8, 长途跋涉, Unt= Snt+(1<p>是),要求是一个积分常量表达式。C++标准包括以下例子: namespace ValueType { enum Enum { Boolean = 0, Float = 1, Double, SInt = 8, SLong, UInt = SInt + (1 <<4), ULong = SLong + (1 << 4) }; } enum { d, e, f=e+2 };,c++,enums,portability,C++,Enums,Portability,正如他所指出的,这是合法的 在一些罕见的情况下,我们应该意识到,只有在完全定义了枚举之后才指定枚举数的类型。该标准对枚举数的类型(7.2/4)作了如下说明: 每个枚举定义的类型不同于所有其他类型。在枚举说明符的右大括号之后,每个枚举数都有其枚举的类型。在右大括号之前,每个枚举数的类型是其初始化值的类型。如果为枚举数指定了初始值设定项,则初始化值具有与表达式的类型相同。如果没有为第一个枚举数指定初始值设定项,则该类型为未指定的整数类型。否则,该类型与前一个枚举数的初始化值的类型相同,除非递增值在该
namespace ValueType {
enum Enum {
Boolean = 0,
Float = 1,
Double,
SInt = 8,
SLong,
UInt = SInt + (1 <<4),
ULong = SLong + (1 << 4)
};
}
enum { d, e, f=e+2 };
基本上,为
E0
选择的类型会影响E1
的结果值,我甚至不知道这是合法的…neatIt不是真正的自引用。您有一些成员引用以前定义的成员。这里的规则是正常的-一旦定义,它就可见。我更新了问题以反映您的point.Thank.:)重要的一点是,枚举数的可见性在结束之前开始这对C++用户很有用,但对于C++编译器的建设者来说更为复杂。当我看到你的答案和帕维尔的上述内容时,我立刻想起了Boost和meta编程,我怎么不记得?HEH。谢谢。):甚至可以使用布尔值:EnUM {Yes=true,NO=!!是!}。是的,根据C++的规则,积分类型包括“布尔、char、W查尔格、符号和无符号整数类型”和“布尔值作为整体类型。”可以理解且合乎逻辑,但我不明白为什么有人会避免给出初始值。这样做毫无意义地让您受编译器实现的支配。举个例子,在MSVC 2008中,您的E生成:E0(0)、E1(-1)、E2(0).就像所有这些行为一样,人们有时只是假设编译器会做明智的事情。当然,明智是他们期望发生的事情。