Почему это не разрешено в C++?
До тех пор, пока вы не определите его, переменная не станет l-значением.
Почему разрешено инициализировать элементы-члены const?
Даже в этом случае требуется определение, если вы собираетесь принять адрес переменной.
9.4.2 Статические элементы данных
объявления статических данных состоит в определении класса не определения и может быть из неполного типа, кроме сорта -qualified 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 ситуация становится немного более сложной. Теперь все литеральные типы могут быть инициализированы (в отличие от только интегральных типов в текущем стандарте), что означало бы, что все типы скаляров (включенные с плавающей точкой) и некоторые типы классов теперь могут быть инициализированы с использованием инициализатора в объявлении.
Спасибо за отличный ответ, вы мешали мне вытащить мой звук из головы! У меня есть один вопрос, есть ли какой-либо возможный способ указать нулевой указатель при определении ссылочных элементов? –
@TimVisee Не уверен, что это возможно - по крайней мере, в переносном режиме, но не в UB, но вы получите недопустимую ссылку. Если вам нужна семантика NULL, просто используйте указатель или, возможно, используйте что-то вроде Boost Optional. –