tgoop.com/cpp_geek/338
Create:
Last Update:
Last Update:
Почему std::move
может не сработать
Многие думают, что std::move
всегда приводит к перемещению. Но это не так. std::move
не двигает — он просто превращает объект в rvalue-ссылку. Всё остальное — за перегрузками.
Вот ловушка:
void take(std::string s) {
// s — копия, даже если передавали std::move
}
std::string str = "hello";
take(std::move(str)); // ❌ копирование, не перемещение
Почему? Потому что
take
принимает по значению, а значит, всегда делает копию. Даже если ты передал std::move(str)
, она скопируется в s
. Чтобы работало перемещение, нужна rvalue-ссылка:
void take(std::string&& s) {
// теперь s — это rvalue-ссылка
}
Но даже тут можно облажаться:
void take(std::string&& s) {
process(s); // ❌ снова копия!
}
void process(std::string); // по значению
Нужно снова вызвать std::move, если хочешь передать дальше как rvalue:
void take(std::string&& s) {
process(std::move(s)); // ✅ перемещение
}
Правило:
std::move
— это обещание, что объект можно "украсть". Но воровать будет только та функция, которая перегружена для rvalue.➡️ @cpp_geek
BY C++ geek
Share with your friend now:
tgoop.com/cpp_geek/338