Jeg har fundet et underligt stykke stykke kode i et projekt, jeg skal vedligeholde. Der er et tomt array-medlem af en klasse, der ikke fører til en compiler-fejl. Jeg har testet nogle variationer af en sådan kode med MSVC 10.0:
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;
}
Fejlmeddelelsen ved int i []
er helt fornuftig for mig. Koden, der vises med klasse D
, er velformet standard C ++. Men hvad er der med klasserne A
, B
og C
? Hvilken type typer er medlemsvariablerne int i []
i disse klasser?