Trong C++ 11, người ta có thể mặc định rõ ràng một hàm thành viên đặc biệt, nếu thế hệ ngầm của nó được tự động ngăn chặn.Thực thi một cách rõ ràng chức năng thành viên đặc biệt mặc định thành viên
Tuy nhiên, mặc định rõ ràng chức năng thành viên đặc biệt chỉ hoàn tác việc xóa ngầm định bằng cách khai báo thủ công một số hàm thành viên đặc biệt khác (thao tác sao chép, hủy, vv), không buộc trình biên dịch tạo ra hàm và mã được coi là được hình thành tốt ngay cả khi chức năng không thể được tạo ra.
Hãy xem xét kịch bản sau đây:
struct A
{
A() = default;
A (const A&) = default;
A (A&&) = delete; // Move constructor is deleted here
};
struct B
{
B() = default;
B (const B&) = default;
B (B&&) = default; // Move constructor is defaulted here
A a;
};
Các nhà xây dựng di chuyển trong B sẽ không được tạo ra bởi trình biên dịch, bởi vì làm như vậy sẽ gây ra một lỗi biên dịch (A của constructor di chuyển sẽ bị xóa). Nếu không xóa rõ ràng hàm tạo của A, hàm tạo của B sẽ được tạo như mong đợi (sao chép A, thay vì di chuyển nó).
Cố gắng di chuyển như một đối tượng âm thầm sẽ sử dụng constructor sao chép thay vì:
B b;
B b2 (std::move(b)); // Will call B's copy constructor
Có cách nào để buộc các trình biên dịch vào hoặc tạo ra các chức năng hoặc phát hành một lỗi biên dịch nếu nó có thể không? Nếu không có sự đảm bảo này, rất khó để dựa vào các nhà xây dựng di chuyển mặc định, nếu một nhà xây dựng đã xóa duy nhất có thể vô hiệu hóa di chuyển cho toàn bộ hệ thống phân cấp đối tượng.
Bạn không nên biết liệu các thành viên bạn có bao gồm có thể di chuyển được hay không? – NathanOliver
Chúng có thể di chuyển khi lớp được triển khai ban đầu, tuy nhiên, nếu có thêm thành viên nào được thêm vào sau, yêu cầu di chuyển có thể bị bỏ qua (đặc biệt nếu chúng được thêm bởi người khác). –
Cần lưu ý rằng một loại mà xóa constructor di chuyển của nó nhưng * không * constructor sao chép của nó là rất ... kỳ quái. Hoàn toàn không có gì để đạt được bằng cách làm điều này. Vì vậy, tốt nhất nên bỏ qua trường hợp này, coi đó là kết quả của một người làm điều ngu ngốc không có lý do gì. –