Чтобы ответить на реальный вопрос, который вы задали: «потому что так говорится в стандарте».
Только переменные статических, константных, целочисленных типов (включая перечисления) могут быть инициализированы внутри объявления класса. Если компилятор поддерживает встроенную инициализацию float, это расширение. Как указывали другие, способ работы со статическими, постоянными, нецелыми переменными - это определить и инициализировать их в соответствующем исходном файле класса (а не в заголовке).
C ++ Стандартный раздел 9.2 «Члены класса», пункт 4:
A член-декларатор может содержать
constant-initializer , только если он объявляет статический член (9.4) из
константный интеграл или константное перечисление
тип, см. 9.4.2.
Раздел 9.4.2 «Элементы статических данных», пункт 2:
Если элемент статических данных имеет постоянную
целочисленный или константный тип перечисления,
его объявление в определении класса
можно указать константа-инициализатор
которая должна быть интегральной константой
выражение (5.19). В этом случае
член может появляться в интегральной константе
выражения. Член все еще должен быть
определяется в области имен пространства, если это
используется в программе и пространстве имен
Определение объема не должно содержать
инициализатор .