นี่คือการสนทนาที่น่าสนใจ การเรียงลำดับของการอ้างอิงอย่างชัดเจนนั้นผิดกฎหมายโดยสิ้นเชิง แต่ IMHO เป็นสาเหตุที่ทำให้ไม่ง่ายเหมือนกับการพูดว่า "ไม่ใช่วัตถุ" หรือ "ไม่มีขนาด" ฉันจะชี้ให้เห็นว่าอาร์เรย์ตัวเองไม่ใช่วัตถุที่เต็มเปี่ยมใน C / C ++ - ถ้าคุณคัดค้านลองใช้แม่แบบ stl บางคลาสโดยใช้อาร์เรย์เป็นพารามิเตอร์แม่แบบ 'class' และดูว่าเกิดอะไรขึ้น คุณไม่สามารถคืนค่ากำหนดส่งผ่านเป็นพารามิเตอร์ได้ (อาร์เรย์ param ถือเป็นตัวชี้) แต่มันถูกกฎหมายที่จะทำให้อาร์เรย์ของอาร์เรย์ การอ้างอิงมีขนาดที่คอมไพเลอร์สามารถและต้องคำนวณ - คุณไม่สามารถกำหนดขนาดของการอ้างอิงได้ แต่คุณสามารถสร้างโครงสร้างที่ไม่มีอะไรนอกจากการอ้างอิง มันจะมีขนาดเพียงพอที่จะมีตัวชี้ทั้งหมดที่ใช้การอ้างอิง คุณสามารถ'
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
ในความเป็นจริงคุณสามารถเพิ่มบรรทัดนี้ในนิยาม struct
struct mys {
...
int & operator[]( int i ) { return i==0?a : i==1? b : c; }
};
... และตอนนี้ฉันมีบางอย่างที่ดูเหมือนเป็นจำนวนมาก:
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
ทีนี้นี่ไม่ใช่อาเรย์จริงมันเป็นโอเปอเรเตอร์ที่เกินกำลัง มันจะไม่ทำสิ่งต่าง ๆ ที่อาร์เรย์ทำตามปกติเช่น sizeof (arr) / sizeof (arr [0]) เป็นต้น แต่มันก็เป็นสิ่งที่ฉันต้องการให้มีการอ้างอิงมากมายที่ต้องทำด้วยกฎหมาย C ++ ที่สมบูรณ์แบบ ยกเว้น (a) เป็นความเจ็บปวดในการตั้งค่าสำหรับองค์ประกอบมากกว่า 3 หรือ 4 รายการและ (b) กำลังทำการคำนวณโดยใช้กลุ่ม?: ซึ่งสามารถทำได้โดยใช้การจัดทำดัชนี (ไม่ใช่การสร้างดัชนี C-pointer-calcul-semantics ปกติ แต่การจัดทำดัชนียังคงมีอยู่) ฉันต้องการดู 'อาร์เรย์ของการอ้างอิง' ที่ จำกัด มากซึ่งสามารถทำได้จริง เช่นอาร์เรย์ของการอ้างอิงจะไม่ถือว่าเป็นอาร์เรย์ทั่วไปของสิ่งต่าง ๆ ที่เป็นการอ้างอิง แต่มันจะเป็น 'อาร์เรย์ของการอ้างอิง' ใหม่ ทำกับแม่แบบ)
สิ่งนี้อาจใช้ได้ถ้าคุณไม่รังเกียจสิ่งที่น่ารังเกียจเช่นนี้: ให้เรียงใหม่ '* นี่' เป็นอาร์เรย์ของ int * และกลับการอ้างอิงที่ทำจากหนึ่ง: (ไม่แนะนำ แต่มันแสดงให้เห็นว่า 'อาร์เรย์' ที่เหมาะสม จะทำงาน):
int & operator[]( int i ) { return *(reinterpret_cast<int**>(this)[i]); }