C++11 不可复制对象的新放置

C++11 不可复制对象的新放置,c++11,unique-ptr,placement-new,noncopyable,C++11,Unique Ptr,Placement New,Noncopyable,我试图模拟一个独特指针的向量,只是为了了解新的放置方式如何处理无法复制的对象 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* roy

我试图模拟一个独特指针的
向量
,只是为了了解新的放置方式如何处理无法复制的对象

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);
}
班级人员
{
字符串名;
const int born;
公众:
Person(字符串N,int B):姓名(N),出生(B){}
};
int main()
{
使用T=唯一性_ptr;
内部容量=4,大小=0;
T*royals=(T*)::新操作员(sizeof(T)*容量);
对于(常数T和项目:{
使你独一无二(“伊丽莎白”,1926年),
使你独一无二(菲利普,1921年)
{
新(皇家+尺寸)T(项目);
++大小;
}
::操作员删除(皇家);
}
new(royals+size)T(item)
是一个编译错误,因为无法复制唯一指针

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);
}
我们必须移动唯一指针,而不是复制。不幸的是,在这种情况下,它们无法移动,因为它们位于初始值设定项列表中

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

是否有解决此问题的方法?

在一个实例中初始化唯一指针。数组中的对象可以移出,这与初始值设定项列表中的对象不同

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);
}
intmain()
{
使用T=唯一性_ptr;
内部容量=4,大小=0;
T*royals=(T*)::新操作员(sizeof(T)*容量);
T init[]={
使你独一无二(“伊丽莎白”,1926年),
使你独一无二(“菲利普”,1921年)
};
用于(T&T项:初始)
{
新的(皇家+尺寸)T(移动(项目));
++大小;
}
::操作员删除(皇家);
}