Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗cpOpMvMC 122 of 150 menu
◀ ▶

Функция 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, если указатель источника стал нулевым.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить