Оператор перемещения в C++
Оператор присваивания перемещением обновляет уже существующий объект.
Сначала он освобождает старый буфер левой стороны, затем забирает указатель из правой и обнуляет источник.
Проверка if (this != &other) нужна
и для перемещения: при самоприсваивании
нельзя удалить буфер, который еще
предстоит украсть.
Запишем Box с деструктором, конструктором
перемещения и оператором operator=(Box&&):
class Box {
public:
int* ptr;
Box() {
ptr = new int[1];
ptr[0] = 0;
}
Box(Box&& other) noexcept {
ptr = other.ptr;
other.ptr = nullptr;
}
Box& operator=(Box&& other) noexcept {
if (this != &other) {
delete[] ptr;
ptr = other.ptr;
other.ptr = nullptr;
}
return *this;
}
~Box() {
delete[] ptr;
}
};
Сейчас создадим два объекта и переместим один в другой:
int main() {
Box left;
Box right;
right.ptr[0] = 17;
left = std::move(right);
std::cout << left.ptr[0] << "\n";
std::cout << (right.ptr == nullptr) << "\n";
return 0;
}
Реализуйте оператор присваивания перемещением
для Tile с буфером из одного int.
Присвойте правый объект левому через
функцию move и выведите число
из буфера левого объекта и 1,
если указатель справа обнулился.