为何这段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
相关产品推荐
相关产品推荐

