Tôi đã tìm thấy một đoạn mã tìm kiếm kỳ lạ trong một dự án mà tôi phải duy trì. Có một thành viên mảng trống của một lớp không dẫn đến lỗi trình biên dịch. Tôi đã thử nghiệm một số biến thể của mã như vậy với MSVC 10,0:Khai báo mảng trống - hành vi biên dịch lạ
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;
}
Thông báo lỗi tại int i[]
là hoàn toàn hợp lý với tôi. Mã được hiển thị với lớp D
là chuẩn C++ chuẩn. Nhưng còn các lớp học A
, B
và C
thì sao? Loại biến nào là biến thành viên int i[]
trong lớp này?
Câu hỏi đặt ra là: Tại sao các cảnh báo (liên quan đến cảnh báo 'A',' B' và 'C') thay vì lỗi? Theo tôi, điều này là không đối xứng so với lỗi tôi nhận được trên khai báo của biến cục bộ. – 0xbadf00d
Xem chỉnh sửa của tôi, vui lòng. – sergio
Cảm ơn, một phần mở rộng "đẹp" của Microsoft khác với tiêu chuẩn C++ ... – 0xbadf00d