cplusplus - static variables c++
Campo estático de un tipo incompleto, ¿es legal? (2)
¿Es legal declarar un campo estático de un tipo que está incompleto en el momento de la definición de clase en C ++? Por ejemplo:
Foo.h:
class Foo
{
public:
// ...
private:
class Bar;
static Bar something;
};
Foo.cpp:
class Foo::Bar
{
// ...
};
Foo::Bar Foo::something;
// some more code
Los compiladores parecen aceptarlo, y no veo una razón por la cual deba rechazarse, pero ¿qué dice la norma sobre tal situación? Realmente agradecería que alguien diera una cita directa de la norma, preferiblemente de la "antigua" (la de 2003).
No puedo citar el estándar, pero puedo darte el consejo de "pensar como un compilador".
En el momento en que declara something
, ¿qué debe saber el compilador sobre el tipo? Si fuera un miembro normal, necesitaría saber el tamaño para poder incluirlo en la definición de la clase, pero eso no es cierto para los miembros estáticos porque su almacenamiento no es parte de la clase. No necesita saber cómo construirlo porque no se construirá como parte de una construcción de clase. Realmente no hay nada que el compilador necesite saber sobre esa clase estática en el momento de su declaración, por lo que una declaración de reenvío funciona bien.
Sí, lo que está haciendo está específicamente permitido (§9.4.2 / 2): "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 que no sea el vacío calificado por cv".