Tôi có một phương thức trả về một đối tượng theo giá trị. Phương pháp này xuất phát từ một thư viện mà tôi không kiểm soát được. Để xử lý thêm đối tượng, tôi muốn tiếp tục làm việc với unique_ptr trên đối tượng này. Đây là một ví dụ:
#include <iostream>
#include <memory>
class Bla {
public:
Bla() { std::cout << "Constructor!\n"; }
~Bla() { std::cout << "Destructor!\n"; }
};
Bla GetBla() {
Bla bla;
return std::move(bla);
}
int main() {
auto bla = std::make_unique<Bla>(GetBla());
}
Ví dụ tạo ra đầu ra sau:
Constructor!
Destructor!
Destructor!
Destructor!
Tại sao kẻ hủy diệt của Bla được gọi 3 lần ở đây? Là cách tôi tạo unique_prt có đúng không?
std::move
không di chuyển bất cứ điều gì. Nó chỉ đúc từ loại này sang loại khác.
std::move
trên return
là một sai lầm lớn.