tg-me.com/cpp_geek/316
Last Update:
Почему std::move
может не сработать, как ты ожидал
Всё просто? Хочешь передать объект по move — вызываешь std::move(obj)
и думаешь, что теперь точно будет перемещение. Но не всё так однозначно.
void foo(std::string s) {
std::string local = std::move(s);
}
Выглядит, будто
s
перемещается в local
. Но на практике — нет. Здесь копирование. Почему?s — это lvalue, несмотря на
std::move
в правой части. А значит, выбирается std::string
конструктор копирования, если только он не удалён.Чтобы реально переместить, нужно явно вызвать
std::move
:
std::string local = std::move(s); // ОК — move-конструктор
Но будь осторожен:
std::string getStr() {
std::string tmp = "hello";
return std::move(tmp); // ❌ Не всегда нужно!
}
Здесь
std::move
ломает RVO (Return Value Optimization). Компилятор мог бы вернуть tmp
без перемещения, вообще без копий. А std::move
мешает, заставляя делать move-конструктор.Выводы:
–
std::move
не двигает, он обещает, что ты больше не тронешь объект– Будь осторожен с
std::move
в return
– Не забудь, что lvalue остаётся lvalue, даже если ты его "обернул"
std::move
➡️ @cpp_geek
BY C++ geek

Share with your friend now:
tg-me.com/cpp_geek/316