簡體   English   中英

為什么插入 std::unordered_set 調用復制構造函數?

[英]why does insert in std::unordered_set call the copy constructor?

我有一個 std::unordered_set 指針。 如果我做

int main()
{
  std::unordered_set<std::unique_ptr<int>> set;
  set.insert(std::make_unique(3));
}

一切正常,插入調用移動構造函數(我認為)。 但是我有一種不同的情況,類似於以下代碼

std::unordered_set<std::unique_ptr<int>> set;
void add(const std::unique_ptr<int>& obj) {set.insert(obj);}

int main
{
  std::unique_ptr<int> val = std::make_unique<int>(3);
  add(std::move(val));
}

這不會編譯。 它給

State 錯誤 C2280 'std::unique_ptr<int,std::default_delete>::unique_ptr(const std::unique_ptr<int,std::default_delete> &)':試圖引用已刪除的 ZC1C425268E68385D1AB5074C17414

這意味着它正在嘗試調用復制構造函數(對嗎?)。 所以問題是:為什么當 object 在 function 內時,它不移動 object? 我還嘗試將指針傳遞給 unique_ptr ,甚至幾乎在任何地方添加 std::move ,但始終調用復制構造函數

void add(const std::unique_ptr<int>& obj) 

它歸結為一些基本的東西:根據定義,您不能移動常量 object。 “移動”基本上意味着從 object 中取出內臟,並將所有內臟推入新的、移至 object 中(以最有效的方式,具有外科醫生的精確度)。 如果從 object 移出的是const ,你就不能這樣做。 這是觸不可及的。 它必須保持其原始的原始狀態。

如果參數是右值引用,您應該能夠做到這一點:

void add(std::unique_ptr<int>&& obj) {set.insert(std::move(obj));}

根據定義, std::unique_ptr 沒有復制構造函數。 它確實有一個移動構造函數。 但是你這里的唯一指針是一個常量,所以不能調用移動構造函數

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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