std :: vector <T>:: emplace_back для ссылки rvalue - PullRequest
1 голос
/ 21 апреля 2020

У меня есть следующая функция внутри класса

  void add_state(std::string &&st) {
    state.emplace_back(st);           // state is a vector
  }

st - это l-значение (в данном случае ссылка на строку), основанное на моем понимании. Если я хочу переместить st в последний элемент в state, я должен использовать state.emplace_back(std::move(st))? Что произойдет, если я оставлю это так, как написано выше?

EDIT 1 (пример того, как называется add_state):

// do a series of operations to acquire std::string str
add_state(std::move(str)); 
// also note that str will never be used again after passing it into add_state

Было бы лучше, если бы вместо этого я сделал add_state(std::string &st)? В этом случае, я думаю, я могу просто позвонить с add_state(str)?

1 Ответ

5 голосов
/ 21 апреля 2020

[...] я должен использовать state.emplace_back(std::move(st))?

Да.

Что произойдет, если я оставлю это так, как написано выше ?

Вы правильно определили, что st является lvalue, поэтому оно копируется.

Было бы лучше, если бы вместо этого я сделал add_state(std::string &st)? В этом случае, я думаю, я могу просто позвонить по номеру add_state(str)?

Вы можете, но не должны. std::move это просто жонглирование типа, оно ничего не делает само по себе (в частности, оно ничего не перемещает). Фактическая операция происходит внутри std::string::basic_string(std::string &&), которая вызывается emplace_back после получения std::string &&. Создание собственного параметра в качестве ссылки на lvalue не имеет никакого эффекта, кроме как удивить вызывающего, который получает std::string съеденного без std::move с их стороны.

...