является конструктором перемещения для класса, который содержит динамически выделенный массив, который должен удалить его? Например, у меня есть:
template<typename T>
class MyVector
{
public:
MyVector()
{
data = new T[32];
capacity = 32;
size = 0;
}
MyVector(const MyVector<T>& o) //The basic copy constructor
{
capacity = o.capacity;
size = o.size;
data = new T[capacity];
for(int i = 0; i < _size; i++)
{
data[i] = o.data[i];
}
}
MyVector(const MyVector<T>&& o) //The move constructor
{
//What goes here?
}
private:
T* data;
unsigned int size;
unsigned int capacity;
};
Я понимаю, что конструктор перемещения вызывается, когда я делаю что-то вроде:
MyVector A; A = MyVector(); // Тот, что справа, вызывает конструктор перемещения? То есть он должен быть идентичен конструктору копирования?
является конструктором перемещения для класса, который содержит динамически выделенный массив, который должен удалить его? Например, у меня есть:
Нечего удалять. Объект строится в конце концов. Все, что он должен делать, это взять ресурсы с объекта на RHS. Он должен оставить RHS в разумном состоянии. Например,
MyVector(MyVector<T>&& o)
{
data = o.data;
o.data = nullptr;
capacity = o.capacity;
o.capacity = 0;
size = o.size;
o.size = 0;
}
Обратите внимание, что для того, чтобы конструктор перемещения работал, параметр не может быть const
. Конструктор перемещения изменяет свой аргумент.
size
и capacity
.
Vector
не будет работать с типами, которые не имеют конструктора по умолчанию. Реальные векторы не создают 32 новыхT
s при создании; они выделяют достаточно памяти для 32T
s, а затем позже заполняют эту память объектами по мере необходимости с помощью размещения нового.