Đây là một cuộc thảo luận thú vị. Rõ ràng các mảng giới thiệu là hoàn toàn bất hợp pháp, nhưng IMHO lý do tại sao không đơn giản như nói 'chúng không phải là đối tượng' hoặc 'chúng không có kích thước'. Tôi đã chỉ ra rằng bản thân các mảng không phải là các đối tượng chính thức trong C / C ++ - nếu bạn phản đối điều đó, hãy thử khởi tạo một số lớp mẫu stl bằng cách sử dụng một mảng làm tham số mẫu 'lớp' và xem điều gì sẽ xảy ra. Bạn không thể trả lại chúng, gán chúng, chuyển chúng dưới dạng tham số. (một tham số mảng được coi là một con trỏ). Nhưng nó là hợp pháp để tạo ra các mảng của mảng. Các tham chiếu có một kích thước mà trình biên dịch có thể và phải tính toán - bạn không thể sizeof () một tham chiếu, nhưng bạn có thể tạo một cấu trúc không chứa gì ngoài các tham chiếu. Nó sẽ có kích thước đủ để chứa tất cả các con trỏ thực hiện các tham chiếu. Bạn có thể'
struct mys {
int & a;
int & b;
int & c;
};
...
int ivar1, ivar2, arr[200];
mys my_refs = { ivar1, ivar2, arr[12] };
my_refs.a += 3 ; // add 3 to ivar1
Trong thực tế, bạn có thể thêm dòng này vào định nghĩa struct
struct mys {
...
int & operator[]( int i ) { return i==0?a : i==1? b : c; }
};
... và bây giờ tôi có một cái gì đó trông RẤT NHIỀU như một loạt các ref:
int ivar1, ivar2, arr[200];
mys my_refs = { ivar1, ivar2, arr[12] };
my_refs[1] = my_refs[2] ; // copy arr[12] to ivar2
&my_refs[0]; // gives &my_refs.a == &ivar1
Bây giờ, đây không phải là một mảng thực sự, nó là một quá tải toán tử; chẳng hạn, nó sẽ không làm những thứ mà mảng thường làm như sizeof (mảng) / sizeof (Array [0]). Nhưng nó thực hiện chính xác những gì tôi muốn một loạt các tài liệu tham khảo để làm, với C ++ hoàn toàn hợp pháp. Ngoại trừ (a) thật khó để thiết lập hơn 3 hoặc 4 phần tử và (b) đó là thực hiện một phép tính bằng cách sử dụng một nhóm ?: Có thể được thực hiện bằng cách lập chỉ mục (không phải với lập chỉ mục ngữ nghĩa tính toán con trỏ C thông thường , nhưng dù sao chỉ mục). Tôi muốn thấy một loại 'tham chiếu' rất hạn chế có thể thực sự làm điều này. Tức là một mảng các tài liệu tham khảo sẽ không được coi là một mảng chung của những thứ là tài liệu tham khảo, mà nó sẽ là một 'tham chiếu' mới thực hiện với các mẫu).
điều này có thể sẽ hoạt động, nếu bạn không bận tâm đến loại khó chịu này: recast '* this' dưới dạng một mảng của int * 'và trả về một tham chiếu được tạo từ một: (không được đề xuất, nhưng nó cho thấy cách' mảng 'thích hợp sẽ làm việc):
int & operator[]( int i ) { return *(reinterpret_cast<int**>(this)[i]); }