Int и short допустимы, и если ваш компилятор не разрешает их, тогда ваш компилятор перебор:
9.4.2 / 4: ... Если элемент статических данных имеет постоянное или постоянное значение
тип перечисления, его объявление в
определение класса может указывать
инициализатор константы , который должен быть целым выражением константы.
Я полагаю, что причина того, что числа с плавающей точкой и числа с двойными числами не рассматриваются специально как константы в стандарте C ++, так же как и целочисленные типы, заключается в том, что стандарт C ++ настороженно относится к тому, что арифметические операции над числами с плавающей точкой и double могут быть тонко отличается на компиляторе, чем на машине, которая выполняет код. Чтобы компилятор вычислял константное выражение типа (a + b), ему нужно получить тот же ответ, который получит среда выполнения.
Это не такая большая проблема для целых чисел - вы можете сравнительно дешево эмулировать целочисленную арифметику, если она отличается. Но для компилятора эмулировать аппаратное обеспечение с плавающей запятой на целевом устройстве может быть очень сложно. Это может быть даже невозможно, если существуют разные версии чипа, а компилятор не знает, на каком коде будет выполняться. И это еще до того, как вы начнете возиться с режимом округления IEEE. Таким образом, стандарт избежал необходимости, чтобы не было необходимости определять, когда и как оценка во время компиляции может отличаться от оценки во время выполнения.
Как упоминает Брайан, C ++ 0x собирается решить эту проблему с помощью constexpr
. Если я прав насчет первоначальной мотивации, то, вероятно, 10 лет было достаточно для преодоления трудностей в определении этого материала.