CPP_GEEK Telegram 338
Почему 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
👍8🤔32👨‍💻1



tgoop.com/cpp_geek/338
Create:
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

View MORE
Open in Telegram


Telegram News

Date: |

The administrator of a telegram group, "Suck Channel," was sentenced to six years and six months in prison for seven counts of incitement yesterday. Users are more open to new information on workdays rather than weekends. A vandalised bank during the 2019 protest. File photo: May James/HKFP. A few years ago, you had to use a special bot to run a poll on Telegram. Now you can easily do that yourself in two clicks. Hit the Menu icon and select “Create Poll.” Write your question and add up to 10 options. Running polls is a powerful strategy for getting feedback from your audience. If you’re considering the possibility of modifying your channel in any way, be sure to ask your subscribers’ opinions first. A Hong Kong protester with a petrol bomb. File photo: Dylan Hollingsworth/HKFP.
from us


Telegram C++ geek
FROM American