Tôi đã viết mã sau đây, nơi tôi cố gắng sao chép giá trị của đối tượng unique_ptr
vào một cấu trúc.Sao chép giá trị std :: unique_ptr thông qua dereferencing
#include <iostream>
#include <memory>
using namespace std;
struct S {
S(int X = 0, int Y = 0):x(X), y(Y){}
// S(const S&) {}
// S& operator=(const S&) { return *this; }
int x;
int y;
std::unique_ptr<S> ptr;
};
int main() {
S s;
s.ptr = std::unique_ptr<S>(new S(1, 4));
S p = *s.ptr; // Copy the pointer's value
return 0;
}
Nó bật lên lỗi trong Visual C++ 2012:
IntelliSense: không có chuyển đổi người dùng xác định phù hợp với từ "S" thành "S" tồn tại
IntelliSense: không điều hành "=" trận đấu các toán hạng loại toán hạng là: std :: unique_ptr> = std :: unique_ptr>
lỗi C2248: 'std :: unique_ptr < _Ty> :: unique_ptr': không thể truy cập viên tin khai báo trong lớp 'std :: unique_ptr < _Ty> '
Trừ khi tôi bỏ ghi chú các dòng mà tôi đã cố xác định hàm tạo bản sao và toán tử =. Điều này sẽ loại bỏ các lỗi trình biên dịch nhưng không phải lỗi IntelliSense. Nó biên dịch bất kể lỗi IntelliSense hiển thị trong danh sách lỗi.
Vì vậy, tại sao nó không thể sử dụng các hàm mặc định và biên dịch với chúng? Tôi có đang làm bản sao giá trị đúng cách không? Làm thế nào tôi nên xác định các nhà xây dựng bản sao nếu nó cần một?
Có thực sự không có cách nào để sao chép giá trị của con trỏ ngay cả trên một đối tượng ngăn xếp mà không bị mất nó? Bằng cách đó tôi có nghĩa là để lại thông tin 'ptr' một mình, và chỉ sao chép các giá trị của' x' và 'y'. – cpx
@cpx Toàn bộ điểm của một 'unique_ptr' là nó là duy nhất, vì vậy không có đối tượng nào khác có thể ghi vào bộ nhớ của con trỏ. Nếu bạn muốn nhiều hơn một đối tượng tham chiếu đến bộ nhớ, bạn cần sử dụng lớp thích hợp, có thể là 'shared_ptr'. – IllusiveBrian
Có thể sao chép dữ liệu được chỉ bởi 'unique_ptr' và đặt bản sao đó bên trong một' unique_ptr' mới. Tôi cho rằng nó hoàn toàn hợp lý. Con trỏ ban đầu vẫn là 'duy nhất', vẫn là con trỏ duy nhất đến đối tượng ban đầu đó. Bạn có thể chọn một con trỏ khác với đối tượng * khác * với cùng giá trị. Ví dụ. 'auto x1 = make_unique (7); auto x2 = make_unique (7); '** Nhưng **, nó sẽ dẫn đến việc cắt (và có thể hành vi không xác định) nếu bạn cố gắng sao chép giá trị tại một' unique_ptr 'mà thực sự trỏ đến một' Nguồn gốc '. (Có cách giải quyết cho điều đó nữa.) –