Copy elision เป็นการปรับให้เหมาะสมที่คอมไพเลอร์ส่วนใหญ่นำไปใช้ เพื่อป้องกันสำเนาพิเศษ (อาจมีราคาแพง) ในบางสถานการณ์ ดังนั้นหากคุณมีโค้ดที่สร้างอ็อบเจกต์ที่ไม่ได้ใช้หรือไม่มีผลข้างเคียง
ตัวอย่าง
struct MyStruct { MyStruct() {} MyStruct(const MyStruct&) { std::cout << "Copied.\n"; } }; MyStruct f() { return MyStruct(); } int main() { std::cout << "Main\n"; MyStruct obj = f(); }
ผลลัพธ์
คุณสามารถรับผลลัพธ์ใด ๆ ต่อไปนี้ตามคอมไพเลอร์และการตั้งค่า -
Main Main Copied Copied Main Copied
ซึ่งหมายความว่าสามารถสร้างอ็อบเจ็กต์ได้น้อยกว่าที่คุณคาดไว้ ดังนั้นคุณจึงไม่สามารถพึ่งพาคอนสตรัคเตอร์และตัวทำลายล้างจำนวนเฉพาะที่ถูกเรียกได้ คุณไม่ควรมีตรรกะที่สำคัญใน copy/move-constructors หรือ destructors เนื่องจากคุณไม่สามารถวางใจได้ว่าจะถูกเรียก