c++ - 为什么在 std::unordered_set 中插入会调用复制构造函数?

标签 c++ insert unordered-set

我有一个 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));
}

这不会编译。它给出了

状态错误 C2280 'std::unique_ptr::unique_ptr(const std::unique_ptr &)': 试图引用已删除的函数

这意味着它正在尝试调用复制构造函数(对吧?)。所以问题是:为什么 insert 在函数内部时不移动对象?我还尝试将指针传递给 unique_ptr,甚至在几乎所有地方都添加 std::move 但总是调用复制构造函数

最佳答案

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

它归结为一些基本的东西:根据定义,你不能移动一个常量对象。 “移动”基本上是指从被移出的对象中撕掉内脏,然后将所有内脏插入新的、被移动到的对象中(以最有效的方式,以外科医生的精确度)。如果移出的对象是 const,则不能这样做。这是碰不得的。它必须保持其原始的原始状态。

如果参数是右值引用,你应该能够这样做:

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

关于c++ - 为什么在 std::unordered_set 中插入会调用复制构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67228676/

相关文章:

python - 将预定义数组插入大数组并迭代移动较小数组的位置

c++ - size_t : an operator?(以及使用 unordered_set 的方法)

c++ - 无法加载 64 位 dll

用于执行控制的 c++ 函数代理

mysql - 是否可以从 Windows 命令行执行数据库插入?

c++ - 如何填充项目为 8 个字符的集合? (std::set<字符[8]>)

c++ - 如何在 C++ 中创建一组无序的整数对?

C++:在点后提取字符串

c++ - 我怎样才能使 Eclipse C.D.T.认识 C++11 的特性?

php - 在插入 [mysql_errno()] 之前检查预先存在的记录的最快方法