Размещение нового для не копируемых объектов
Я пытаюсь смоделировать vector
уникальных указателей, просто чтобы узнать, как размещение новых работает с объектами, которые не могут быть скопированы.
class Person
{
string name;
const int born;
public:
Person (string N, int B) : name(N), born(B) {}
};
int main()
{
using T = unique_ptr <Person>;
int capacity = 4, size = 0;
T* royals = (T*) ::operator new (sizeof(T) * capacity);
for (const T& item: {
make_unique <Person> ("Elizabeth", 1926),
make_unique <Person> ("Philip", 1921) })
{
new (royals + size) T(item);
++size;
}
::operator delete (royals);
}
Линия new (royals + size) T(item)
это ошибка компиляции, потому что уникальные указатели не могут быть скопированы.
Вместо копирования мы должны перемещать уникальные указатели. К сожалению, в этом случае их нельзя переместить, поскольку они находятся в списке инициализатора.
Есть ли решение этой проблемы?
1 ответ
Решение
Инициализируйте уникальные указатели в массиве вместо списка инициализаторов. Объекты в массиве могут быть удалены, в отличие от объектов в списке инициализатора.
int main()
{
using T = unique_ptr <Person>;
int capacity = 4, size = 0;
T* royals = (T*) ::operator new (sizeof(T) * capacity);
T init[] = {
make_unique <Person> ("Elizabeth", 1926),
make_unique <Person> ("Philip", 1921)
};
for (T& item: init)
{
new (royals + size) T(move(item));
++size;
}
::operator delete (royals);
}