He encontrado una pieza extraña de código en un proyecto que tengo que mantener. Hay un miembro vacío de la matriz de una clase que no conduce a un error de compilación. He probado algunas variaciones de un código de este tipo con MSVC 10.0:Declaración de matriz vacía: comportamiento extraño del compilador
template<class T> struct A {
int i[];
}; // warning C4200: nonstandard extension used : zero-sized array in struct/union
template<class T> struct B { static int i[]; };
template<class T> int B<T>::i[];
struct C {
int i[];
}; //warning C4200: nonstandard extension used : zero-sized array in struct/union
template<class T> struct D { static int i[]; };
template<class T> int D<T>::i[4];
template<> int D<int>::i[] = { 1 };
int main()
{
A<void> a;
B<void> b;
C c;
D<void> d0;
D<int> d1;
a.i[0] = 0; // warning C4739: reference to variable 'a' exceeds its storage space
b.i[0] = 0; // warning C4789: destination of memory copy is too small
c.i[0] = 0; // warning C4739: reference to variable 'c' exceeds its storage space
int i[]; // error C2133: 'i' : unknown size
d0.i[0] = 0; // ok
d0.i[1] = 0; // ok
return 0;
}
El mensaje de error al int i[]
es absolutamente razonable para mí. El código que se muestra con la clase D
es C++ estándar bien formado. Pero ¿qué pasa con las clases A
, B
y C
? ¿Qué tipo de tipos son las variables miembro int i[]
en estas clases?
La pregunta es: ¿Por qué las advertencias (relacionadas con las clases 'A',' B' y 'C') son advertencias en lugar de errores? En mi opinión, esto se compara asimétricamente con el error que obtengo en la declaración de la variable local. – 0xbadf00d
Ver mi edición, por favor. – sergio
Gracias, otra "buena" extensión de Microsoft para el estándar C++ ... – 0xbadf00d