[英]Can I use a `unique_ptr` in a vector, or do I need to switch to `shared_ptr`?
給這個類一個unique_ptr:
class MyClass
{
public:
MyClass(){}
MyClass(MyClass &&other) : ptr(std::move(other.ptr)){}
std::unique_ptr <int> ptr;
};
有什么辦法可以使std::vector<MyClass>
嗎?
void ThisBreaksIt()
{
MyClass instance;
std::vector<MyClass> mv;
mv.push_back(instance);
}
就這樣,這給了我錯誤
error C2248: 'std::unique_ptr<_Ty>::unique_ptr' : cannot access private member declared in class 'std::unique_ptr<_Ty>'
這是有道理的,因為我沒有復制構造函數,並且當編譯器嘗試創建默認復制構造函數時,它會嘗試復制unique_ptr
,這是不允許的。
我可以通過添加以下構造函數使其進行編譯:
MyClass(const MyClass&){}
但是,當然,這unique_ptr
尚未初始化,這不是我想要的。
我無法添加
MyClass(const MyClass& other) : ptr(std::move(other.ptr)){}
因為它是const
,所以我不能在const
對象上調用std :: move()。 我可以創建構造函數
MyClass(MyClass& other) : ptr(std::move(other.ptr)){}
但不能解決原始的編譯錯誤,因為vector::push_back
使用const
復制構造函數。
所以,我被困住了。 有沒有辦法做我想做的事?
如果我只使用shared_ptr
而不是unique_ptr
,那么所有這些問題都會消失。 那是我應該做的嗎?
將不可復制類型存儲在向量中沒有問題; 它只需要像您一樣移動即可。
問題是:
mv.push_back(instance);
嘗試插入instance
的副本,並且該類不可復制。 但是它是可移動的:
mv.push_back(std::move(instance));
請注意,在此示例中,無需編寫自己的默認值並移動構造函數。 隱式的將完全執行您的操作。
您可以使用emplace_back。 這僅允許添加右值。
因此,請執行以下操作:
void ThisShouldFixIt()
{
mv.emplace_back(MyClass());
}
需要注意的是emplace_back可以調用牛逼implace的適用構造,如提到的下面 。 對於您正在做的事情,push_back很好,因為確實存在帶有右值引用的版本。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.