auto a = new int[0];
ตาม[basic.compound.3]ค่าที่เก็บไว้a
จะต้องเป็นหนึ่งในค่าต่อไปนี้:
- ตัวชี้ไปยังวัตถุ (ชนิด
int
)
- ตัวชี้ผ่านจุดสิ้นสุดของวัตถุ
- โมฆะ
- โมฆะ
เราสามารถแยกความเป็นไปได้แรกออกเนื่องจากไม่มีวัตถุประเภทที่int
สร้างขึ้น ความเป็นไปได้ที่สามถูกตัดออกเนื่องจาก C ++ ต้องการตัวชี้ที่ไม่ใช่ค่า null ที่จะถูกส่งคืน (ดู[basic.stc.dynamic.allocation.2] ) ดังนั้นเราจึงมีความเป็นไปได้สองอย่าง: ตัวชี้ผ่านจุดสิ้นสุดของวัตถุหรือตัวชี้ที่ไม่ถูกต้อง
ฉันอยากจะเห็นa
ว่าเป็นตัวชี้อดีตที่ผ่านมา แต่ฉันไม่ได้มีการอ้างอิงที่มีชื่อเสียงในการสร้างที่แน่นอน (แม้ว่าจะมีความหมายที่ชัดเจนของเรื่องนี้ใน[basic.stc]โดยดูว่าคุณสามารถใช้delete
ตัวชี้นี้ได้อย่างไร) ดังนั้นฉันจะสร้างความบันเทิงที่เป็นไปได้ทั้งสองอย่างในคำตอบนี้
ระหว่างการคัดลอกเริ่มต้นและการลบคุณได้รับอนุญาตให้อ่านตัวชี้ที่a + 1
?
พฤติกรรมไม่ได้กำหนดไว้ตามที่กำหนดโดย[expr.add.4]โดยไม่คำนึงถึงความเป็นไปได้ที่จะใช้จากด้านบน
ถ้าa
เป็นพอยน์เตอร์ตัวสุดท้ายจะถูกพิจารณาให้ชี้ไปที่องค์ประกอบสมมุติที่ดัชนี0
ของอาร์เรย์ที่ไม่มีองค์ประกอบ การเพิ่มจำนวนเต็มj
จะa
ถูกกำหนดเฉพาะเมื่อ0≤0+j≤n
ซึ่งn
ขนาดของอาเรย์ ในกรณีของเราn
เป็นศูนย์ดังนั้นจำนวนเงินa+j
ที่ถูกกำหนดให้เฉพาะเมื่อเป็นj
0
โดยเฉพาะอย่างยิ่งการเพิ่ม1
ไม่ได้กำหนด
หากa
ไม่ถูกต้องเราจะตกลงไปที่ "มิฉะนั้นพฤติกรรมจะไม่ได้กำหนด" (ไม่น่าแปลกใจกรณีที่กำหนดครอบคลุมเฉพาะค่าตัวชี้ที่ถูกต้องเท่านั้น)
นอกจากนี้ไม่อนุญาตให้มีภาษาคอมไพเลอร์ชุดa
ไปnullptr
?
เลขจากดังกล่าวข้างต้น[basic.stc.dynamic.allocation.2] : "หากคำขอสำเร็จค่าส่งกลับโดยฟังก์ชั่นการจัดสรรถอดเปลี่ยนเป็นค่าตัวชี้ null ไม่ใช่" นอกจากนี้ยังมีเชิงอรรถเรียกออกว่า C ++ (แต่ไม่ใช่ C) ต้องใช้ตัวชี้ที่ไม่เป็นโมฆะในการตอบสนองต่อการร้องขอเป็นศูนย์
a
อย่างแน่นอน (แน่นอนคุณไม่สามารถตรวจสอบได้)