You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何这段C++代码可将std::unique_ptr push_back到std::vector?

问题解答

你的猜测是错误的,std::unique_ptr本身的拷贝构造、拷贝赋值运算符已经被C++标准库显式标记为deleted,和你自定义的Test类有没有删除拷贝构造没有任何关系。代码能够正常运行的核心原因如下:

  • 你往vector插入元素时调用的是push_back的右值重载:std::make_unique<Test>()返回的是临时的std::unique_ptr<Test>右值,这里走的是std::unique_ptr的移动构造逻辑,直接把智能指针的所有权转移到vector的存储空间中,全程没有触发拷贝操作,完全符合C++语法规则。
  • C++11及之后的标准中,std::vector原生支持存储仅可移动不可拷贝的类型,不需要存储的类型支持拷贝操作。
  • 后续遍历vector的时候你用的是auto &test的引用形式,只是给vector里存储的unique_ptr取别名,没有发生值拷贝,自然也不会触发被删除的拷贝构造函数。

如果你想复现你预期中的报错,只要尝试对vector里的unique_ptr做拷贝操作即可,比如加入如下代码编译器会直接抛出错误:

// 错误示例:尝试拷贝unique_ptr,调用了被删除的拷贝构造函数
auto test_copy = tests[0];

内容的提问来源于stack exchange,提问作者wlodek14a

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.14 16:36:03