使用先前定义的成员作为枚举定义中后来成员的一部分是合法的吗?

时间:2009-10-26 21:38:57

标签: c++ enums portability

namespace ValueType {
  enum Enum {
    Boolean = 0,
    Float = 1,
    Double,
    SInt = 8,
    SLong,
    UInt = SInt + (1 <<4),
    ULong = SLong + (1 << 4)
  };
}

2 个答案:

答案 0 :(得分:12)

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

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

答案 1 :(得分: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的结果值。