C++使用unique_ptr作为set函数参数报错C2280怎么解决?
C++ unique_ptr C2280报错修复方案
报错根因
std::unique_ptr是独占所有权的智能指针,C++标准显式删除了它的拷贝构造、拷贝赋值运算符,禁止复制unique_ptr实例,仅支持通过移动语义转移所有权。你收到的报错正是因为代码中尝试调用被删除的unique_ptr拷贝构造函数导致的。
问题代码位置
错误出现在类A的setA成员函数中:
void setA(std::vector<std::unique_ptr<int>> vec) { for (int i = 0; i < vec.size(); i++) { vecvec.push_back(vec.at(i)); // 此处尝试拷贝unique_ptr,触发报错 } }
vec.at(i)返回unique_ptr的左值引用,直接传入push_back会触发拷贝逻辑,虽然你调用setA时已经通过std::move(vec)把外层vec的所有权转移给了形参vec,但往成员变量vecvec插入元素时依然做了非法的拷贝操作。
修复方法
方法1:逐个移动元素
修改push_back逻辑,把vec中元素的所有权转移到成员变量中:
void setA(std::vector<std::unique_ptr<int>> vec) { for (int i = 0; i < vec.size(); i++) { vecvec.push_back(std::move(vec.at(i))); } }
方法2:直接转移整个vector所有权(更简洁高效)
不需要循环逐个移动,直接把整个vec的所有权转移给成员变量vecvec:
void setA(std::vector<std::unique_ptr<int>> vec) { vecvec = std::move(vec); }
额外注意
你当前代码中类A的默认构造函数仅声明未定义,编译会触发链接错误,补充空实现即可:
class A { // ...其余代码不变 public: A() = default; // 补全默认构造函数 // ...其余代码不变 };
内容的提问来源于stack exchange,提问作者wdafoe666
相关产品推荐
相关产品推荐

