Законно ли использование ранее определенных членов как части более поздних членов определения enum? - PullRequest
6 голосов
/ 27 октября 2009
namespace ValueType {
  enum Enum {
    Boolean = 0,
    Float = 1,
    Double,
    SInt = 8,
    SLong,
    UInt = SInt + (1 <<4),
    ULong = SLong + (1 << 4)
  };
}

Ответы [ 2 ]

12 голосов
/ 27 октября 2009

Да. Требуется, чтобы это было целочисленное константное выражение. Стандарт C ++ включает в себя следующий пример:

enum { d, e, f=e+2 };
1 голос
/ 27 октября 2009

Как указал Джерри , это законно.

В некоторых редких случаях важно знать, что тип перечислителей указывается только после того, как перечисление полностью определено. Стандарт говорит следующее о типе перечислений (7.2 / 4):

Каждое перечисление определяет тип, который отличается от всех других типов. После закрывающей скобки спецификатора перечисления каждый перечислитель имеет тип своего перечисления. До закрывающей скобки тип каждого перечислителя является типом его инициализирующего значения. Если для перечислителя указан инициализатор, значение инициализации имеет тот же тип, что и выражение. Если для первого перечислителя не указан инициализатор, тип является неопределенным целочисленным типом . В противном случае тип совпадает с типом начального значения предыдущего перечислителя, если только увеличенное значение не представляется в этом типе, и в этом случае тип является неопределенным целочисленным типом, достаточным для содержания увеличенного значения.

Выделенное предложение может быть показано в следующем примере:

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

Как правило, тип, выбранный для E0, влияет на итоговое значение E1.

...