Sao chép tách rời là một cách tối ưu hóa được hầu hết các trình biên dịch thực hiện để ngăn chặn các bản sao thừa (có thể tốn kém) trong một số trường hợp nhất định. Vì vậy, nếu bạn có một số mã đang tạo các đối tượng không được sử dụng hoặc không có tác dụng phụ,
ví dụ
struct MyStruct { MyStruct() {} MyStruct(const MyStruct&) { std::cout << "Copied.\n"; } }; MyStruct f() { return MyStruct(); } int main() { std::cout << "Main\n"; MyStruct obj = f(); }
Đầu ra
Bạn có thể nhận được bất kỳ đầu ra nào sau đây dựa trên trình biên dịch và cài đặt -
Main Main Copied Copied Main Copied
Điều này có nghĩa là ít đối tượng hơn bạn mong đợi có thể được tạo ra, vì vậy bạn cũng không thể dựa vào số lượng hàm tạo và hàm hủy cụ thể đang được gọi. Bạn không nên có logic quan trọng bên trong các trình tạo bản sao / di chuyển hoặc trình hủy, vì bạn không thể dựa vào việc chúng được gọi.