В main
вызываются следующие конструкторы / операторы присваивания:
Buffer<int> b1; // default constructor
Buffer<int> b2("buf2", 64); // constructor
Buffer<int> b3 = b2; // copy constructor
Buffer<int> b4 = getBuffer<int>("buf4"); // move constructor
b1 = getBuffer<int>("buf5"); // move assignment operator
Когда вы удаляете операции перемещения, это становится:
Buffer<int> b1; // default constructor
Buffer<int> b2("buf2", 64); // constructor
Buffer<int> b3 = b2; // copy constructor
Buffer<int> b4 = getBuffer<int>("buf4"); // copy constructor
b1 = getBuffer<int>("buf5"); // copy assignment operator
Последняя строка (b1 = getBuffer<int>("buf5");
) выявляет проблему в вашем операторе назначения копирования: вы не можете использовать operator=
, чтобы назначить необработанный указатель на unique_ptr
. Вместо этого используйте reset
или создайте новый unique_ptr
:
// copy assignment operator
Buffer &operator=(const Buffer ©) {
if (this != ©) {
_name = copy._name;
if (_size != copy._size) {
_buffer = nullptr;
_size = copy._size;
if (_size > 0) {
_buffer.reset(new T[_size]);
}
}
T *source = copy._buffer.get();
T *dest = _buffer.get();
std::copy(source, source + copy._size, dest);
std::cout << "copy assignment\n";
}
return *this;
}
Чтобы поймать это, даже если ваши конструкторы перемещения включены, я бы добавил в main
новый тест, который вынужден использовать оператор присваивания копии, например:
// ...
b1 = getBuffer<int>("buf5"); // move assignment operator
b2 = b3; // copy assignment operator