不可复制对象的新放置
Placement new for non-copyable objects
我正在尝试模拟 vector
个独特的指针,只是为了了解 placement 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)
行是一个编译错误,因为无法复制唯一指针。
我们必须移动唯一指针而不是复制。不幸的是,在这种情况下,它们无法移动,因为它们位于初始化列表中。
这个问题有解决方法吗?
初始化array instead of initializer list中的唯一指针。与初始化列表中的对象不同,数组中的对象可以移出。
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);
}
我正在尝试模拟 vector
个独特的指针,只是为了了解 placement 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)
行是一个编译错误,因为无法复制唯一指针。
我们必须移动唯一指针而不是复制。不幸的是,在这种情况下,它们无法移动,因为它们位于初始化列表中。
这个问题有解决方法吗?
初始化array instead of initializer list中的唯一指针。与初始化列表中的对象不同,数组中的对象可以移出。
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);
}