Может ли класс, содержащий контейнер уникальных указателей в качестве члена, храниться только в контейнере того же типа? - PullRequest
0 голосов
/ 22 марта 2020

В моем проекте я использую контейнер для хранения уникальных указателей. Первоначально я использовал 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_container на std::list<std::unique_ptr<int>> list_container. Я получил ошибку, которая сказала мне, что я скопировал уникальный указатель. Это смутило меня, и я подумал, будет ли это счастливее из-за природы std::list, но я не нашел ничего, что указывало бы на что-то подобное.

Итак, после некоторой путаницы я обнаружил, что если я изменю std::vector<list> list_s, на std::list<list> list_s ошибка исчезла, код скомпилирован и работал правильно.

Означает ли это, что класс, содержащий контейнер с уникальными указателями в качестве члена, может храниться только в контейнере того же типа? Или я упускаю что-то очень простое?

PS: я использую последний компилятор Visual Studio 2019.

...