เช่นเดียวกันกับที่ถูกต้องตามกฎหมายอนุญาตให้มีการdelete this
จัดวางตำแหน่งใหม่สำหรับthis
เท่าที่ฉันรู้ นอกจากนี้เกี่ยวกับว่าthis
หรือตัวชี้ / การอ้างอิงอื่น ๆ ที่มีอยู่แล้วสามารถนำมาใช้ได้ภายหลังมีข้อ จำกัด บางประการดังนี้:
[basic.life]
หากหลังจากอายุการใช้งานของวัตถุสิ้นสุดลงและก่อนที่หน่วยเก็บข้อมูลที่ครอบครองวัตถุนั้นจะถูกนำมาใช้ใหม่หรือปล่อยออกมาวัตถุใหม่จะถูกสร้างขึ้นในที่เก็บสินค้าซึ่งมีวัตถุดั้งเดิมครอบครองอยู่ตัวชี้ที่ชี้ไปยังวัตถุต้นฉบับ อ้างอิงถึงวัตถุดั้งเดิมหรือชื่อของวัตถุต้นฉบับจะอ้างถึงวัตถุใหม่โดยอัตโนมัติและเมื่ออายุการใช้งานของวัตถุใหม่เริ่มต้นขึ้นสามารถใช้เพื่อจัดการวัตถุใหม่ได้หาก:
- ที่เก็บข้อมูลสำหรับวัตถุใหม่ซ้อนทับตำแหน่งที่เก็บข้อมูลที่วัตถุดั้งเดิมครอบครองและ
- วัตถุใหม่นั้นเป็นชนิดเดียวกับวัตถุต้นฉบับ (ไม่สนใจตัวตรวจสอบ CV ระดับบนสุด) และ
- ชนิดของวัตถุต้นฉบับนั้นไม่มีคุณสมบัติแบบ const และถ้าเป็นชนิดของคลาสจะไม่มีสมาชิกของข้อมูลที่ไม่คงที่ซึ่งเป็นชนิดที่มีคุณสมบัติของ const หรือประเภทอ้างอิงและ
- ไม่ใช่วัตถุดั้งเดิมหรือวัตถุใหม่เป็น subobject ที่อาจทับซ้อนกัน ([intro.object])
สองคนแรกมีความพึงพอใจในตัวอย่างนี้ แต่สองคนสุดท้ายจะต้องนำมาพิจารณา
เกี่ยวกับจุดที่สามเนื่องจากฟังก์ชั่นนั้นไม่มีคุณสมบัติของ const จึงควรมีความปลอดภัยพอสมควรที่จะสมมติว่าวัตถุดั้งเดิมนั้นไม่ใช่แบบ const ความผิดปกติจะอยู่ที่ฝั่งผู้โทรหากความมั่นคงถูกทิ้งไป เกี่ยวกับ const / สมาชิกอ้างอิงฉันคิดว่าสามารถตรวจสอบได้โดยยืนยันว่าสิ่งนี้สามารถกำหนดได้:
static_assert(std::is_trivial_v<A> && std::is_copy_assignable_v<A>);
แน่นอนเนื่องจากความสามารถในการมอบหมายเป็นสิ่งจำเป็นคุณสามารถใช้*this = {};
สิ่งที่ฉันคาดหวังว่าจะสร้างโปรแกรมเดียวกันขึ้นมาแทน กรณีการใช้งานอาจจะน่าสนใจมากขึ้นอาจจะนำมาใช้ใหม่ของหน่วยความจำ*this
สำหรับวัตถุชนิดอื่น (ซึ่งจะล้มเหลวความต้องการในการใช้this
อย่างน้อยโดยไม่ต้อง reinterpreting ฟอก +)
เช่นเดียวกับการdelete this
จัดวางตำแหน่งใหม่เพื่อthis
แทบจะไม่สามารถอธิบายได้ว่า "ปลอดภัย"