Tôi đang sử dụng Visual Studio 2012 Update 2 và đang gặp sự cố khi cố gắng hiểu tại sao std :: vector đang cố gắng sử dụng hàm tạo bản sao của unique_ptr. Tôi đã xem xét các vấn đề tương tự và hầu hết đều liên quan đến việc không có một hàm tạo và/hoặc toán tử di chuyển rõ ràng.Di chuyển ngữ nghĩa với unique_ptr
Nếu tôi thay đổi biến thành viên thành chuỗi, tôi có thể xác minh rằng hàm tạo di chuyển được gọi; tuy nhiên, cố gắng sử dụng kết quả unique_ptr trong lỗi biên dịch:
error C2248: 'std::unique_ptr<_Ty>::unique_ptr' : cannot access private member declared in class 'std::unique_ptr<_Ty>'
.
Tôi hy vọng một người nào đó có thể chỉ cho tôi những gì tôi đang bỏ lỡ, cảm ơn!
#include <vector>
#include <string>
#include <memory>
class MyObject
{
public:
MyObject() : ptr(std::unique_ptr<int>(new int))
{
}
MyObject(MyObject&& other) : ptr(std::move(other.ptr))
{
}
MyObject& operator=(MyObject&& other)
{
ptr = std::move(other.ptr);
return *this;
}
private:
std::unique_ptr<int> ptr;
};
int main(int argc, char* argv[])
{
std::vector<MyObject> s;
for (int i = 0; i < 5; ++i)
{
MyObject o;
s.push_back(o);
}
return 0;
}
Nếu bạn muốn xây dựng đối tượng của bạn trực tiếp trong vector, bạn cũng có thể chỉ 'emplace' họ: ' cho (int i = 0; i <5; ++ i) s.emplace_back(); 'Điều đó cũng làm việc với VC11. –