簡體   English   中英

我可以在向量中使用“ unique_ptr”嗎,還是需要切換到“ shared_ptr”?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM