Почему это не разрешено в C ++?
До тех пор, пока вы не определите это, переменная не станет l-значением.
Почему константные члены допускаются для инициализации?
Даже в этом случае определение требуется, если вы собираетесь взять адрес переменной.
9.4.2 Элементы статических данных
2 Объявление члена статических данных в его определении класса не является определением иможет быть неполного типа, кроме cv-квалифицированного void.Определение для статического члена данных должно появиться в области пространства имен, включающей определение класса члена.В определении в области пространства имен имя члена статических данных должно быть квалифицировано по имени его класса с помощью оператора ::.Выражение инициализатора в определении статического члена данных находится в области его класса
Кроме того, это в первую очередь артефакт использования, поэтому вы можете написать:
class S {
static const int size = 42;
float array[ size ];
};
Означает ли это, что статические переменные в C ++ не инициализируются с 0, как в C?
Нет, они:
3.6.2 Инициализация не-локальные переменные
Переменные со статической продолжительностью хранения (3.7.1) или продолжительностью хранения потока (3.7.2) должны быть обнулены (8.5) перед любой другой инициализацией.
Хотя в C ++ 0x дела обстоят немного сложнее.Все литеральные типы теперь могут быть инициализированы (в отличие от только целочисленных типов в текущем стандарте), что означает, что все скалярные типы (включая числа с плавающей запятой) и некоторые типы классов теперь могут быть инициализированы с помощью инициализатора в объявлении.