ฉันต้องการรีเฟรชหน่วยความจำของฉันตามเงื่อนไขที่คอมไพลเลอร์มักสร้างตัวสร้างเริ่มต้นตัวสร้างการคัดลอกและตัวดำเนินการกำหนดโดยอัตโนมัติ
ฉันจำได้ว่ามีกฎบางอย่าง แต่ฉันจำไม่ได้และยังไม่พบแหล่งข้อมูลที่มีชื่อเสียงทางออนไลน์ ใครสามารถช่วย?
ฉันต้องการรีเฟรชหน่วยความจำของฉันตามเงื่อนไขที่คอมไพลเลอร์มักสร้างตัวสร้างเริ่มต้นตัวสร้างการคัดลอกและตัวดำเนินการกำหนดโดยอัตโนมัติ
ฉันจำได้ว่ามีกฎบางอย่าง แต่ฉันจำไม่ได้และยังไม่พบแหล่งข้อมูลที่มีชื่อเสียงทางออนไลน์ ใครสามารถช่วย?
คำตอบ:
ต่อไปนี้ "สร้างอัตโนมัติ" หมายถึง "ประกาศโดยปริยายว่าเป็นค่าเริ่มต้น แต่ไม่ได้กำหนดให้เป็นลบ" มีสถานการณ์ที่ประกาศฟังก์ชันสมาชิกพิเศษ แต่กำหนดเป็นลบ
const
สมาชิกในชั้นเรียนจะป้องกันไม่ให้ตัวสร้างสร้างขึ้นโดยอัตโนมัติ ...
ฉันพบว่าแผนภาพด้านล่างมีประโยชน์มาก
= delete
(ชัดเจน) หรือ= default
(ไม่ชัดเจนสำหรับฉัน) ฉันถูกไหม?
C ++ 17 N4659 ร่างมาตรฐาน
สำหรับการอ้างอิงข้ามมาตรฐานอย่างรวดเร็วโปรดดูที่ส่วน "ประกาศโดยนัย" ของรายการ cppreference ต่อไปนี้:
ข้อมูลเดียวกันนี้สามารถหาได้จากมาตรฐานแน่นอน เช่นในC ++ 17 N4659 ร่างมาตรฐาน :
15.8.1 "Copy / move constructor" สำหรับสำหรับ copy constructor:
6 ถ้านิยามคลาสไม่ได้ประกาศตัวสร้างการคัดลอกอย่างชัดเจนตัวสร้างที่ไม่ชัดเจนจะถูกประกาศโดยปริยาย ถ้านิยามคลาสประกาศตัวสร้างการย้ายหรือตัวดำเนินการกำหนดย้ายตัวสร้างการคัดลอกที่ประกาศโดยปริยายจะถูกกำหนดเป็นลบ มิฉะนั้นจะกำหนดเป็นค่าเริ่มต้น (11.4) กรณีหลังจะเลิกใช้ถ้าคลาสมีตัวดำเนินการกำหนดสำเนาที่ผู้ใช้ประกาศหรือตัวทำลายที่ผู้ใช้ประกาศ
และสำหรับตัวสร้างการย้าย:
8 ถ้านิยามของคลาส X ไม่ได้ประกาศตัวสร้างการย้ายอย่างชัดเจนตัวสร้างที่ไม่ชัดเจนจะถูกประกาศโดยปริยายว่าเป็นค่าเริ่มต้นถ้าและต่อเมื่อ
(8.1) - X ไม่มีตัวสร้างการคัดลอกที่ผู้ใช้ประกาศ
(8.2) - X ไม่มีตัวดำเนินการกำหนดสำเนาที่ผู้ใช้ประกาศ
(8.3) - X ไม่มีตัวดำเนินการกำหนดการย้ายที่ผู้ใช้ประกาศและ
(8.4) - X ไม่มีตัวทำลายที่ผู้ใช้ประกาศ
15.8.2 "ตัวดำเนินการกำหนดสำเนา / ย้าย" พูดสำหรับการกำหนดสำเนา:
2 ถ้านิยามคลาสไม่ได้ประกาศตัวดำเนินการกำหนดสำเนาอย่างชัดเจนตัวดำเนินการหนึ่งจะถูกประกาศโดยปริยาย ถ้านิยามคลาสประกาศตัวสร้างการย้ายหรือตัวดำเนินการกำหนดย้ายตัวดำเนินการกำหนดสำเนาที่ประกาศโดยปริยายจะถูกกำหนดเป็นลบ มิฉะนั้นจะกำหนดเป็นค่าเริ่มต้น (11.4) กรณีหลังจะเลิกใช้ถ้าคลาสมีตัวสร้างการคัดลอกที่ผู้ใช้ประกาศหรือตัวทำลายที่ผู้ใช้ประกาศ
และสำหรับการมอบหมายการย้าย:
4 ถ้านิยามของคลาส X ไม่ได้ประกาศตัวดำเนินการกำหนดการย้ายอย่างชัดเจนตัวดำเนินการหนึ่งจะถูกประกาศโดยปริยายว่าเป็นค่าเริ่มต้นถ้าและต่อเมื่อ
- (4.1) - X ไม่มีตัวสร้างสำเนาที่ผู้ใช้ประกาศ
- (4.2) - X ไม่มีตัวสร้างการย้ายที่ผู้ใช้ประกาศ
- (4.3) - X ไม่มีตัวดำเนินการกำหนดสำเนาที่ผู้ใช้ประกาศและ
- (4.4) - X ไม่มีตัวทำลายที่ผู้ใช้ประกาศ
15.4 "Destructors" กล่าวไว้สำหรับผู้ทำลาย:
4 ถ้าคลาสไม่มีตัวทำลายที่ผู้ใช้ประกาศตัวทำลายล้างจะถูกประกาศโดยปริยายว่าเป็นค่าเริ่มต้น (11.4) Destructor ที่ประกาศโดยปริยายเป็นสมาชิกสาธารณะแบบอินไลน์ของคลาส