По умолчанию перечисления автоматически получают целочисленные значения, начиная с 0, компилятором. Таким образом, дата будет нулевой, время один и деньги два. Следующее значение присваивается значению перечисления psuedo TYPE_COUNT
, которое получит заданное значение три, равное количеству «правильных» значений перечисления.
TYPE_UNKNOWN
- это другое значение, представляющее что-то, что не является «правильным» значением, поэтому провалит тест e < TYPE_COUNT
. Его значение равное TYPE_COUNT
означает, что каждое отдельное значимое значение является смежным, но я не знаю о каком-либо существенном преимуществе этого (было бы, если бы TYPE_COUNT
был на единицу меньше степени 2, что могло бы повлиять на то, какое представление компилятор может использовать, и его «приятно» иметь смежные значения, но это не имеет значения, так как вы не увеличиваете их в любом случае за TYPE_COUNT
)