¿Por qué no permitido en C++?
Hasta y a menos que lo defina, la variable no se convierte en un valor l.
¿Por qué se pueden inicializar los miembros de const?
Incluso en este caso, se requiere una definición si se va a tomar la dirección de la variable.
9.4.2 miembros de datos estáticos
la declaración de un miembro de datos estáticos en su definición de clase no es una definición y puede ser de un tipo incompleto distinto cv - vacío calificado. La definición de un miembro de datos estáticos debe aparecer en un ámbito de espacio de nombres que incluye la definición de clase del miembro. En la definición en ámbito de espacio de nombres, el nombre del miembro de datos estáticos se debe calificar por su nombre de clase utilizando el operador :: . La expresión de inicialización en la definición de un conjunto de datos estáticos miembro está en el alcance de su clase
Además, se trata fundamentalmente de un artefacto de uso por lo que se puede escribir:
class S {
static const int size = 42;
float array[ size ];
};
¿El estas variables estáticas medias en C++ no se inicializan con 0 como en C?
No son:
3.6.2 Inicialización de variables no locales
variables con duración estática de almacenamiento (3.7.1) o de la duración de almacenamiento de hilo (3.7. 2) se debe ceroinicializar (8.5) antes de que cualquier otra inicialización tome el lugar .
Aunque las cosas se vuelven un poco más complicadas en C++ 0x. Ahora se pueden inicializar todos los tipos literales (a diferencia de solo los tipos integrales en el estándar actual) lo que significa que todos los tipos escalares (flotantes incluidos) y algunos tipos de clase ahora se pueden inicializar usando un inicializador en la declaración.
Gracias por la gran respuesta, ¡me impidió sacar mi oído de mi cabeza! Tengo una pregunta, ¿hay alguna manera de proporcionar un puntero nulo mientras se definen los miembros de referencia? –
@TimVisee No estoy seguro de si es posible, al menos de forma portátil, no UB, pero terminaría con una referencia no válida. Si quieres semántica NULL simplemente usa un puntero o tal vez uses algo como Boost Opcional. –