Tom array-erklæring - mærkelig kompilatoradfærd

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?

9
задан Lightness Races with Monica 23 July 2011 в 03:49
поделиться