Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么std::unordered_set中的insert调用复制构造函数?_C++_Insert_Unordered Set - Fatal编程技术网

C++ 为什么std::unordered_set中的insert调用复制构造函数?

C++ 为什么std::unordered_set中的insert调用复制构造函数?,c++,insert,unordered-set,C++,Insert,Unordered Set,我有一组std::无序的指针。如果我这样做 int main() { std::unordered_set<std::unique_ptr<int>> set; set.insert(std::make_unique(3)); } intmain() { std::无序_集; set.insert(std::make_unique(3)); } 一切正常,insert调用move构造函数(我想)。但是,我有一个不同的情况,类似于下面的代码 std::unord

我有一组std::无序的指针。如果我这样做

int main()
{
  std::unordered_set<std::unique_ptr<int>> set;
  set.insert(std::make_unique(3));
}
intmain()
{
std::无序_集;
set.insert(std::make_unique(3));
}
一切正常,insert调用move构造函数(我想)。但是,我有一个不同的情况,类似于下面的代码

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));
}
std::无序集;
void add(const std::unique_ptr&obj){set.insert(obj);}
int main
{
std::unique_ptr val=std::make_unique(3);
添加(std::move(val));
}
而这并不是编译。它给

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


这意味着它试图调用复制构造函数(对吗?)。所以问题是:为什么insert在函数中不移动对象?我还尝试将指针传递到unique\u ptr,甚至在几乎所有地方添加std::move,但是复制构造函数总是被称为std::unique\u ptr,根据定义,它没有复制构造函数。它确实有一个移动构造函数。但是这里的唯一指针是常量,因此不能将move构造函数称为

“根据定义,您不能移动常量对象”。你可以用
voidfoo(constmyobject&&)做一些“有趣”的事情。这也行不通。你自己试试吧。有一种方法可以做到这一点,但需要做更多的工作,而且必须充分了解副作用。回答得好。也可以使用
add(std::unique\u ptr obj)
直接从值类型参数中移动,因为unique\u ptr非常小。哦,你说得对,我太笨了。我将尝试使用右值更改所有内容。谢谢!
void add(const std::unique_ptr<int>& obj) 
void add(std::unique_ptr<int>&& obj) {set.insert(std::move(obj));}