Что такое std::move?

«Что такое std::move?» — вопрос из категории C++ Core, который задают на 25% собеседований C/C++ Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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;
}

Ключевые моменты:

  1. Используйте std::move только тогда, когда вам больше не нужен исходный объект в его текущем состоянии.
  2. Для примитивных типов (int, char) std::move не даёт преимуществ, так как их перемещение эквивалентно копированию.
  3. std::move — это всего лишь каст. Фактическое перемещение происходит в конструкторе или операторе присваивания принимающего объекта.