首页 > 解决方案 > 包含唯一指针容器作为成员的类是否只能存储在相同类型的容器中?

问题描述

在我的一个项目中,我使用一个容器来存储唯一指针。最初我用作std::vector容器,但经过一些重新设计后,我认为这std::list会更合适。所以,我的初始代码是:

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

class vec
{
public:
    int ID = -1;
    std::vector<std::unique_ptr<int>> vec_container;

    vec() = default;
    vec(int ID) : ID(ID) {}
};



int main()
{
    std::vector<vec> vec_s;

    vec_s.emplace_back(vec(1));
    vec_s.emplace_back(vec(2));
    vec_s.emplace_back(vec(3));

    for (auto& v : vec_s)
        std::cout << v.ID << std::endl;


    return 0;
}

更改容器后,我的代码是:

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

class list
{
public:
    int ID = -1;
    std::list<std::unique_ptr<int>> list_container;

    list() = default;
    list(int ID) : ID(ID) {}
};


int main()
{
    std::vector<list> list_s;

    list_s.emplace_back(list(1));
    list_s.emplace_back(list(2));
    list_s.emplace_back(list(3));

    for (auto& l : list_s)
        std::cout << l.ID << std::endl;


    return 0;
}

但是在我更改std::vector<std::unique_ptr<int>> vec_containerstd::list<std::unique_ptr<int>> list_container. 我收到一个错误,告诉我我复制了一个唯一指针。这让我很困惑,我想知道它是否由于 的性质而发生std::list,但我没有发现任何类似的东西。

所以,经过一番摆弄,我发现如果我改变了std::vector<list> list_sstd::list<list> list_s错误消失了,代码编译并正常工作。

这是否意味着包含唯一指针容器作为成员的类只能存储在相同类型的容器中?还是我缺少一些非常简单的东西?

PS:我使用 Visual Studio 2019 的最新编译器。

标签: c++containersunique-ptr

解决方案


推荐阅读