Как указал Джерри , это законно.
В некоторых редких случаях важно знать, что тип перечислителей указывается только после того, как перечисление полностью определено. Стандарт говорит следующее о типе перечислений (7.2 / 4):
Каждое перечисление определяет тип, который отличается от всех других типов. После закрывающей скобки спецификатора перечисления каждый перечислитель имеет тип своего перечисления. До закрывающей скобки тип каждого перечислителя является типом его инициализирующего значения. Если для перечислителя указан инициализатор, значение инициализации имеет тот же тип, что и выражение. Если для первого перечислителя не указан инициализатор, тип является неопределенным целочисленным типом . В противном случае тип совпадает с типом начального значения предыдущего перечислителя, если только увеличенное значение не представляется в этом типе, и в этом случае тип является неопределенным целочисленным типом, достаточным для содержания увеличенного значения.
Выделенное предложение может быть показано в следующем примере:
enum E {
E0 // Unspecified type
, E1 = E0-1 // -1, or MAX_UINT
, E2 // 0 or (MAX_UINT+1)
};
Как правило, тип, выбранный для E0
, влияет на итоговое значение E1
.