Размещение нового для не копируемых объектов - PullRequest
0 голосов
/ 08 сентября 2018

Я пытаюсь смоделировать 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 Ответ

0 голосов
/ 08 сентября 2018

Инициализируйте уникальные указатели в массиве вместо списка инициализаторов . Объекты в массиве можно перемещать, в отличие от объектов в списке инициализатора.

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);
}
...