1

我试图模拟一个vector独特的指针,只是为了了解放置 new 如何处理无法复制的对象。

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)是编译错误,因为无法复制唯一指针。

我们必须移动唯一指针,而不是复制。不幸的是,在这种情况下,它们无法移动,因为它们存在于初始化列表中。

这个问题有解决方法吗?

4

1 回答 1

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);
}
于 2018-09-08T20:51:44.050 回答