私は、維持しなければならないプロジェクトで奇妙な見た目のコードを見つけました。コンパイラエラーを引き起こさないクラスの空の配列メンバがあります。私はMSVC 10.0で、このようなコードのいくつかのバリエーションをテストしてみた:int i[]
で空の配列宣言 - 奇妙なコンパイラの振る舞い
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;
}
エラーメッセージが私には絶対に賢明です。クラスD
で示されているコードは整形式の標準C++です。しかし、クラスについてはどうですか?A
、B
、C
?このクラスのメンバー変数int i[]
はどんな種類の型ですか?
質問:エラーではなく警告(クラス 'A'、' B'および 'C')に関連する警告はなぜですか?私の意見では、これはローカル変数の宣言で得られるエラーと非対称に比較されます。 – 0xbadf00d
私の編集をご覧ください。 – sergio
ありがとう、別の "いい" MicrosoftエクステンションがC++標準に... – 0xbadf00d