右值引用上的 std::vector<T>::emplace_back

Iam*_*non 2 c++ emplace

我在一个类中有以下功能

  void add_state(std::string &&st) {
    state.emplace_back(st);           // state is a vector
  }
Run Code Online (Sandbox Code Playgroud)

st是基于我的理解的左值(在本例中为字符串的右值引用)。如果,我想st进入 中的最后一个元素state,我应该使用state.emplace_back(std::move(st))吗?如果我按照上面写的方式保留它会发生什么?

编辑 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
Run Code Online (Sandbox Code Playgroud)

如果我add_state(std::string &st)代替它会更好吗?在这种情况下,我想我可以简单地用add_state(str)?

Que*_*tin 5

[...] 我应该使用state.emplace_back(std::move(st))吗?

是的。

如果我按照上面写的方式保留它会发生什么?

您已正确识别这st是一个左值,因此它会被复制。

如果我add_state(std::string &st)代替它会更好吗?在这种情况下,我想我可以简单地用add_state(str)?

你可以,但你不应该。std::move只是类型杂耍,它本身不做任何事情(特别是,它不移动任何东西)。实际操作发生在里面std::string::basic_string(std::string &&)emplace_back在它收到std::string &&. 使你自己的参数成为左值引用除了让调用者感到惊讶之外没有任何影响,调用者在std::string没有他们的情况下被吃掉了std::move