首页 > 解决方案 > 为什么这段代码允许 push_back unique_ptr 做向量?

问题描述

所以我认为向矢量添加独特的东西是行不通的。为什么它适用于以下代码?是不是因为没有将复制 ctor 设置为“已删除”?

#include <iostream>
#include <vector>
#include <memory>

class Test
{
    public:
        int i = 5;
};


int main()
{
    std::vector<std::unique_ptr<Test>> tests;
    tests.push_back(std::make_unique<Test>());
    
    for (auto &test : tests)
    {
        std::cout << test->i << std::endl;
    }

    for (auto &test : tests)
    {
        std::cout << test->i << std::endl;
    }
}

标签: c++unique-ptrpush-back

解决方案


这里没有副本,只有移动。

在这种情况下,make_unique 将生成一个未命名的唯一指针实例,并且此 push_back 将其视为 r 值引用,它可以随意使用它。

它产生的结果与此代码几乎相同:

std::vector<std::unique_ptr<Test>> tests;
auto ptr = std::make_unique<Test>();
tests.push_back(std::move(ptr));

如果您想搜索有关此事的更多信息,这称为移动语义。(这仅适用于 c++11 及更高版本)


推荐阅读