tgoop.com/cpp_geek/316
Create:
Last Update:
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:
tgoop.com/cpp_geek/316
