C/C++ Ready | Программирование
Фотография
нажмите — покажем
нажмите — покажем
Почему std::move иногда вообще ничего не двигает?
std::move не перемещает объект сам по себе. Он только превращает выражение в rvalue-ссылку, чтобы компилятор мог выбрать move-конструктор или move-присваивание.
Но если объект const, перемещение может неожиданно превратиться в обычное копирование:
const std::string name = "ready";
std::string copy = std::move(name);
Кажется, что здесь будет move.
Но move-конструктор строки обычно принимает неконстантную rvalue-ссылку:
std::string(std::string&& other);
А из const объекта нельзя безопасно “забрать” внутреннее состояние, потому что это изменило бы объект.
Поэтому компилятор выбирает копирование:
const std::string name = "ready";
std::string result = std::move(name); // copy
Нормальное перемещение работает с неконстантным объектом:
std::string name = "ready";
std::string result = std::move(name); // move
После такого name остаётся валидным, но его содержимое уже не стоит использовать как прежнее значение:
std::cout << result << '\n';
std::move не гарантирует перемещение. Если объект const, чаще всего ты получишь копирование, просто записанное очень уверенным синтаксисом.
📣 C++ Ready | #совет
8 · 2.6K ·