là tương đương này để này
Yes. Nhưng nó chỉ hợp lệ cho các lớp không có thành viên không di chuyển được.Nhìn vào ví dụ này:
#include <iostream>
struct nonmovable
{
nonmovable() = default;
nonmovable(const nonmovable &) = default;
nonmovable( nonmovable &&) = delete;
};
struct movable
{
movable() = default;
movable(const movable &) { std::cerr << "copy" << std::endl; }
movable( movable &&) { std::cerr << "move" << std::endl; }
};
struct has_nonmovable
{
movable a;
nonmovable b;
has_nonmovable() = default;
has_nonmovable(const has_nonmovable &) = default;
has_nonmovable( has_nonmovable &&) = default;
};
int main()
{
has_nonmovable c;
has_nonmovable d(std::move(c)); // prints copy
}
It in:
copy
http://coliru.stacked-crooked.com/a/62c0a0aaec15b0eb
Vì vậy, nếu một lớp có thậm chí là một thành viên không thể di chuyển duy nhất, các nhà xây dựng di chuyển mặc định một cách rõ ràng sẽ sử dụng các nhà thầu bản sao cho tất cả các thành viên, ngay cả đối với những người có công cụ xây dựng di chuyển.
Nhưng các thành viên không bắt buộc phải có các nhà thầu di chuyển được xác định rõ ràng hoặc được mặc định rõ ràng. Nếu constructor di chuyển không được khai báo, thì hàm tạo di chuyển sẽ được sử dụng cho các thành viên có hàm khởi tạo di chuyển và hàm tạo bản sao sẽ được sử dụng cho các thành viên không xác định hàm tạo di chuyển. Xem ví dụ:
#include <iostream>
struct nonmovable
{
nonmovable() = default;
nonmovable(const nonmovable &) { std::cerr << "nonmovable::copy" << std::endl; }
//nonmovable( nonmovable &&) = delete;
};
struct movable
{
movable() = default;
movable(const movable &) { std::cerr << "movable::copy" << std::endl; }
movable( movable &&) { std::cerr << "movable::move" << std::endl; }
};
struct has_nonmovable
{
movable a;
nonmovable b;
has_nonmovable() = default;
has_nonmovable(const has_nonmovable &) = default;
has_nonmovable( has_nonmovable &&) = default;
};
int main()
{
has_nonmovable c;
has_nonmovable d(std::move(c));
}
It in:
movable::move
nonmovable::copy
http://coliru.stacked-crooked.com/a/fda51f29a4b92881
Có các lớp học được di chuyển nhưng không copyable (ví dụ unique_ptr
). Có các lớp có thể sao chép và sử dụng hàm tạo bản sao để di chuyển. Nhưng tôi không biết bất kỳ lý do nào để tạo một lớp có thể sao chép được nhưng đã xóa một cách rõ ràng hàm khởi tạo.
Nguồn
2018-02-26 11:38:17
Đây có thể là một sự trùng lặp của http://stackoverflow.com/questions/4819936/why-no-default-move-assignment-move-constructor –
@ DieterLücking: Rõ ràng là không, mặc dù nó thuộc về một chủ đề tương tự và một số câu trả lời có thể bao gồm mặt bằng tương tự. Tuy nhiên, chúng tôi sẽ không đóng mọi câu hỏi đơn lẻ về ngữ nghĩa di chuyển như các bản sao của nhau. –
Lưu ý, tôi đã thêm câu trả lời cho câu hỏi này bởi vì tại thời điểm tôi đang tìm kiếm một trích dẫn từ tiêu chuẩn đã chứng tỏ chúng tương đương và câu trả lời được chấp nhận không làm điều đó. Vì vậy, tôi chỉ tìm thấy báo giá và thêm câu trả lời của tôi. –