Theo tiêu chuẩn,Mặc định di chuyển constructor/nhiệm vụ và xóa constructor sao chép/chuyển nhượng
Nếu định nghĩa của một lớp X không tuyên bố một cách rõ ràng một constructor di chuyển, người ta sẽ được khai báo ngầm như mặc định khi và chỉ nếu
- X không có một người dùng tuyên bố constructor sao chép,
- X không có một toán tử gán bản sao do người dùng khai báo,
- X không h ave một toán tử gán nhiệm vụ do người dùng khai báo và
- X không có trình phá hủy do người dùng khai báo.
Bây giờ sau thất bại trong việc biên dịch
# include <utility>
class Foo
{
public:
Foo() = default;
Foo(Foo const &) = delete;
};
int main()
{
Foo f;
Foo g(std::move(f)); // compilation fails here
return 0;
}
Vì vậy, có vẻ như một chức năng xóa được coi là người dùng định nghĩa, có ý nghĩa (nó không phải là thực hiện mặc định của nó). Tuy nhiên, trong trường hợp cụ thể, làm thế nào sẽ bị xóa sao chép construtor/gán mess mặc định di chuyển constructor/chuyển nhượng?
Tôi nghĩ câu hỏi này có tầm quan trọng thực tế vì tạo thủ công và đặc biệt. việc duy trì các chức năng mặc định như vậy là dễ bị lỗi, trong khi cùng lúc, sự gia tăng (sự công bình) của việc sử dụng các lớp như std::unique_ptr
khi các thành viên của lớp làm cho các lớp không thể sao chép được nhiều con thú thông thường hơn trước đây.
Không chắc chắn để hiểu rõ câu hỏi của bạn nhưng tại sao bạn không mặc định ctor di chuyển? tức là 'Foo (Foo &&) = mặc định; ' –