Tôi đã có câu hỏi về việc sử dụng duy nhất-ptr trước đây. Tôi nhận được this answer đề xuất sử dụng các đối tượng di chuyển. Tôi định nghĩa một lớp như sau:Có một điểm để xác định các đối tượng chuyển động chỉ trong C++ 11 không?
class B {
const string objName;
public:
B (B &&) = default;
B & operator= (B &&) = default;
B (const B &) = delete;
B & operator= (const B &) = delete;
B(const string & name) :
objName(name) {
}
virtual ~B();
const string name() const { return objName;};
}
và tôi gọi B bằng dòng này:
class A {
A(){}
void take(B b);
}
A a;
B b("test");
cout<<b.name();
a.take(std::move(b));
cout<<b.name();
Câu hỏi của tôi:
- Ngay cả khi tôi đã mặc định các nhà xây dựng di chuyển, tôi không thể viết a.take (b) và tôi nhận được lỗi biên dịch. Tôi hiểu rằng constrctor sao chép bị xóa nhưng Có vẻ như sự lựa chọn hợp lý là sử dụng constructor di chuyển khi nó được mặc định mà không cần viết std :: di chuyển như thế này a.take (b)
- Kết quả là "test" được in hai lần. Tại sao đối tượng b không bị xóa sau khi gọi di chuyển? Nếu đối tượng b vẫn còn tồn tại và một bản sao của nó đã được gửi đến a.take (di chuyển (b)) thì có nghĩa là chúng ta không có bất kỳ việc sử dụng di chuyển nào cho các đối tượng rvalue.
- Có thực hành tốt để sử dụng các đối tượng chỉ di chuyển như trên (Loại bỏ nhà xây dựng bản sao và toán tử gán và hàm tạo di chuyển mặc định và chuyển bài)?
Thử thay thế "thử nghiệm" bằng chuỗi dài hơn và xem điều gì xảy ra. Nói chung giá trị của đối tượng chuyển từ không xác định; nó có thể là giá trị cũ hay không. –
Bạn cần xóa 'const' khỏi' objName' nếu bạn muốn di chuyển từ nó. –
@AlanStokes xóa const sẽ gây ra thử nghiệm đó sẽ được in một lần. Điều đó có nghĩa là các bộ nhớ const sẽ không bao giờ được di chuyển? Hoặc chúng sẽ được sao chép? – Govan