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: |

Hashtags are a fast way to find the correct information on social media. To put your content out there, be sure to add hashtags to each post. We have two intelligent tips to give you: Some Telegram Channels content management tips 6How to manage your Telegram channel? Content is editable within two days of publishing 2How to set up a Telegram channel? (A step-by-step tutorial)
from us


Telegram C++ geek
FROM American