如何将 unique_ptr 从一组移动到另一组? (C++)

Posted

技术标签:

【中文标题】如何将 unique_ptr 从一组移动到另一组? (C++)【英文标题】:How to move a unique_ptr from one set to another? (C++) 【发布时间】:2021-06-21 00:08:56 【问题描述】:

下面的代码给出了错误:Call to deleted constructor of 'std::unique_ptr<int>' 'unique_ptr' has been explicitly marked deleted here passing argument to parameter 'item' here

有人能解释一下这是为什么吗?我原以为一切都会好起来的,因为我在调用 foo.add 时使用了 std::move

#include <iostream>
#include <memory>
#include <set>

class Foo 
 public:
  void add(std::unique_ptr<int> item) 
    set.emplace(std::move(item));
  
 private:
  std::set<std::unique_ptr<int>> set;
;

int main() 
  Foo foo;

  std::set<std::unique_ptr<int>> set;
  set.emplace(std::make_unique<int>(1));
  set.emplace(std::make_unique<int>(2));
  set.emplace(std::make_unique<int>(3));

  for (auto &item : set) 
    foo.add(std::move(item)); // error on this line
  

  return 0;


【问题讨论】:

std::set 中的元素是只读的。您正在通过 const-iterator 遍历集合。 谢谢。我怎样才能解决这个问题?我以为只有在指定 for (const auto &amp; item : set) ... 时才会使用 const 迭代器? Foo(std::set&lt;std::unique_ptr&lt;int&gt;&gt; set) : set(std::move(set)) Foo foo(std::move(set)); 怎么样? 【参考方案1】:

使用c++ 17 extract() function.

example

#include <set>
#include <memory>
#include <iostream>

int main() 
    auto s = std::set<std::unique_ptr<int>>;

    s.insert(std::make_unique<int>(10));

    std::cout << s.size() << "\n";

    auto it = s.extract(s.begin());

    // Pointer type here just for clarification
    std::unique_ptr<int> new_ptr = std::move(it.value());
    
    std::cout << s.size() << "\n";
    
    std::cout << *new_ptr << "\n";

然后你可以使用 while 循环来代替你的 for each 循环:

while (!set.empty()) 
   auto it = set.extract(set.begin());
   foo.add(std::move(it.value());

【讨论】:

@churill 我不存在那里的问题。作为“unique_ptr sink”的函数通常应该按值获取指针。你只需要移动它。 哎呀,你是对的,我的错。出于某种原因,我认为 unique_ptr 的 copy-ctor 会被删除,我很傻。 容易出错。作为 C++ 程序员的诅咒,必须记住所有不同的构造函数和参数类型:P

以上是关于如何将 unique_ptr 从一组移动到另一组? (C++)的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Jenkins 从一台 PC 移动到另一台 PC

将对象从一页移动到另一页?

如何使用 ASP.NET 将文件从一台机器移动到另一台机器?

如何将 redis 数据库从一台服务器移动到另一台服务器?

如何将 redis 数据库从一台服务器移动到另一台服务器?

GraphQL & Mongoose Schema - 如何将一组 mongoose objectId 引用存储到另一种类型?