tgoop.com/cpp_geek/340
Create:
Last Update:
Last Update:
Зачем std::move
от std::string
в emplace_back
?
Кажется, emplace_back(std::move(str))
— избыточно: ведь emplace_back
сам конструирует объект на месте. Но с std::string
и другими перемещаемыми типами всё не так просто.
Пример:
std::vector<std::string> vec;
std::string str = "hello";
vec.emplace_back(str); // копия
vec.emplace_back(std::move(str)); // перемещение
Почему? Потому что:
>
emplace_back
вызывает конструктор std::string(const std::string&)
, если аргумент — const std::string&
,> и
std::string(std::string&&)
, если аргумент — std::string&&
.А
str
— это lvalue. Даже внутри emplace_back
. Без std::move
, ты просишь вектор скопировать
строку. С std::move
— переместить
.Это относится ко всем
emplace_*
, когда ты передаёшь существующий объект. emplace_back("hello")
— другое дело: тут создаётся временный const char*
, и он уже используется для конструктора string
.👉 Правило: если аргумент — перемещаемый объект (например,
std::string
, std::vector), и ты передаёшь его в emplace_*
, не забывай std::move
. Иначе будет лишняя копия.➡️ @cpp_geek
BY C++ geek
Share with your friend now:
tgoop.com/cpp_geek/340