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

std::vector<T>::emplace_back on an rvalue reference

我在 class

中有以下函数
  void add_state(std::string &&st) {
    state.emplace_back(st);           // state is a vector
  }
根据我的理解,

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

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

来调用它

[...] should I be using state.emplace_back(std::move(st))?

是的。

What happens if I leave it the way it's written above?

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

Would it be better if I made add_state(std::string &st) instead? In this case, I think I can just simply call it with add_state(str)?

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