我有一个 std::unordered_set 指针。如果我做
int main()
{
std::unordered_set<std::unique_ptr<int>> set;
set.insert(std::make_unique(3));
}
Run Code Online (Sandbox Code Playgroud)
一切正常并插入调用移动构造函数(我认为)。但是我有一个类似于以下代码的不同情况
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));
}
Run Code Online (Sandbox Code Playgroud)
这不会编译。它给
状态错误 C2280 'std::unique_ptr<int,std::default_delete>::unique_ptr(const std::unique_ptr<int,std::default_delete> &)':试图引用已删除的函数
这意味着它正在尝试调用复制构造函数(对吗?)。所以问题是:为什么 insert 在函数内部时不移动对象?我还尝试将指针传递给 unique_ptr 甚至在几乎所有地方添加 std::move 但始终调用复制构造函数