В моем проекте я использую контейнер для хранения уникальных указателей. Первоначально я использовал 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.