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 เนื่องจากคุณไม่สามารถวางใจได้ว่าจะถูกเรียก