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. Иначе будет лишняя копия.📲 Мы в MAX
➡️ @cpp_geek