繁体   English   中英

标准::向量<t> ::emplace_back 在右值引用上</t>

[英]std::vector<T>::emplace_back on an rvalue reference

我在 class 中有以下 function

  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)调用它?

[...] 我应该使用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::move的情况下吃掉他们的std::string

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM