ทำไมโค้ดนี้จึงคอมไพล์
_Static uint32_t my_arr[2];
_Static_assert(sizeof(my_arr) == 8, "");
_Static_assert(sizeof(my_arr[0]) == 4, "");
_Static_assert(sizeof(my_arr)[0] == 4, "");
การยืนยัน 2 รายการแรกนั้นถูกต้อง แต่ฉันคาดว่าบรรทัดสุดท้ายจะล้มเหลวเนื่องจากความเข้าใจของฉันคือsizeof()
ควรประเมินเป็นลิเทอรัลจำนวนเต็มซึ่งไม่สามารถถือเป็นอาร์เรย์ได้ กล่าวอีกนัยหนึ่งมันจะล้มเหลวในลักษณะเดียวกับที่บรรทัดต่อไปนี้ล้มเหลว:
_Static_assert(4[0] == 4, "");
ที่น่าสนใจสิ่งต่อไปนี้ไม่สามารถรวบรวมได้อย่างแท้จริง (ซึ่งควรทำในสิ่งเดียวกันไม่ใช่หรือ):
_Static_assert(*sizeof(my_arr) == 4, "");
ข้อผิดพลาด: อาร์กิวเมนต์ประเภทที่ไม่ถูกต้องของ unary '*' (have 'long unsigned int') _Static_assert (* sizeof (my_arr) == 4, "");
ถ้าเป็นเรื่องสำคัญฉันใช้ gcc 5.3.0
( sizeof( my_arr ) )[ 0 ]
ล้มเหลว