Функция move в C++
Именованный объект сам в перемещение не отдают. К нему можно обратиться снова, и компилятор не выберет перемещение без явной пометки. Такую переменную называют lvalue.
Функция move из заголовка utility
не переносит данные сама, а приводит
объект к rvalue. После успешного перемещения
источник пуст: указатель в нем
nullptr, и второй раз тот же
буфер не освобождают.
Запишем Box:
#include <iostream>
class Box {
public:
int* ptr;
Box() {
ptr = new int[1];
ptr[0] = 1;
}
Box(const Box& other) {
ptr = new int[1];
ptr[0] = other.ptr[0];
std::cout << "copy ctor\n";
}
Box(Box&& other) noexcept {
ptr = other.ptr;
other.ptr = nullptr;
std::cout << "move ctor\n";
}
~Box() {
delete[] ptr;
}
};
void take(Box item) {
std::cout << item.ptr[0] << "\n";
}
Сейчас передадим объект через функцию move:
int main() {
Box source;
source.ptr[0] = 88;
take(std::move(source));
std::cout << (source.ptr == nullptr) << "\n";
return 0;
}
Соберите класс Slot с полем int*
и конструктором перемещения, который обнуляет
источник. Передайте именованный объект
в функцию через функцию move
и выведите 1, если указатель
источника стал нулевым.