Ответ
std::move — это функция из заголовка <utility>, которая выполняет безусловное приведение переданного аргумента к rvalue-ссылке (T&&). Её основное назначение — явно указать компилятору, что объект можно рассматривать как перемещаемый, тем самым разрешив вызов move-конструктора или move-оператора присваивания вместо их копирующих аналогов.
Важно: std::move сама по себе не перемещает данные. Она лишь подготавливает объект к перемещению.
Пример:
#include <utility>
#include <vector>
#include <string>
int main() {
std::vector<std::string> large_data = {"a", "very", "large", "collection", "of", "strings"};
// Без std::move — вызов КОПИРУЮЩЕГО конструктора (дорого)
std::vector<std::string> copy = large_data;
// С std::move — вызов MOVE-конструктора (дешёвая операция)
std::vector<std::string> moved = std::move(large_data);
// После перемещения состояние 'large_data' валидно, но не определено.
// Обычно он становится пустым, но полагаться можно только на то,
// что его можно безопасно уничтожить или присвоить ему новое значение.
return 0;
}
Ключевые моменты:
- Используйте
std::moveтолько тогда, когда вам больше не нужен исходный объект в его текущем состоянии. - Для примитивных типов (int, char)
std::moveне даёт преимуществ, так как их перемещение эквивалентно копированию. std::move— это всего лишь каст. Фактическое перемещение происходит в конструкторе или операторе присваивания принимающего объекта.