Khi C++ được tạo, nó đã được quyết định là hàm tạo mặc định, sao chép-khởi tạo, phép gán và hàm hủy sẽ được tạo tự động (trừ khi được cung cấp). Tại sao ? Bởi vì các trình biên dịch C++ có thể biên dịch (đa số) mã C với các ngữ nghĩa giống nhau, và đó là cách struct
hoạt động trong C.
Tuy nhiên, sau này người dùng viết một trình phá hủy tùy chỉnh, có lẽ cô ấy cần phải viết tùy chỉnh copy-constructor/assignment-operator quá; điều này được gọi là Rule of Big Three. Với hindsight, chúng ta có thể thấy rằng có thể chỉ định rằng copy-constructor/assign-operator/destructor được tạo ra sẽ chỉ được tạo nếu không có 3 trong số đó được người dùng cung cấp, và nó có thể đã bắt được rất nhiều lỗi. .. và vẫn giữ lại khả năng tương thích ngược với C.
Vì vậy, khi C++ 11 xuất hiện, nó đã được quyết định rằng thời gian này sẽ được thực hiện ngay: di chuyển mới-constructor và di chuyển-giao-điều hành sẽ chỉ được được tạo tự động nếu rõ ràng là người dùng không làm bất cứ điều gì "đặc biệt" với lớp học. Bất cứ điều gì "đặc biệt" được định nghĩa là xác định lại hành vi di chuyển/sao chép/hủy diệt.
Để giúp đỡ trường hợp, mọi người sẽ làm điều gì đó đặc biệt nhưng vẫn muốn phương pháp đặc biệt "được tạo tự động", lớp phủ đường = default
cũng được thêm vào.
Thật không may, vì lý do tương thích ngược, ủy ban C++ không thể quay ngược thời gian và thay đổi quy tắc tự động tạo bản sao;
Tôi ước rằng họ đã không dùng nó để mở đường cho phiên bản tiếp theo của tiêu chuẩn, nhưng tôi nghi ngờ họ sẽ làm như vậy. Tuy nhiên,
không được chấp nhận nữa (xem §12.8/7 đối với hàm tạo bản sao chẳng hạn, lịch sự của @Nevin).
Nguồn
2013-03-26 10:38:03
Từ quan điểm chỉ khái niệm (hãy cẩn thận, không có giải thích kỹ thuật), cả hai đều không bằng nhau, ví dụ: mọi đối tượng có thể sao chép đều có thể di chuyển nhưng không phải là cách khác. Di chuyển là trường hợp đặc biệt của việc sao chép áp dụng trong một số trường hợp nhất định. Vì vậy, nó có ý nghĩa rằng hành vi autogeneration của họ là bằng cách nào đó sai lệch. Nhưng tôi để nó cho người khác để dịch nó thành tiêu chuẩn kỹ thuật với những ví dụ thích hợp. Khác hơn là câu hỏi tốt, tất nhiên. –