【问题标题】:std::vector<T>::emplace_back on an rvalue reference右值引用上的 std::vector<T>::emplace_back
【发布时间】:2020-04-21 14:35:17
【问题描述】:

我在一个类中有以下函数

  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 &amp;st) 会更好吗?在这种情况下,我想我可以简单地用add_state(str) 调用它?

【问题讨论】:

  • 我想了解更多关于使用 r 值引用、std::move 和 emplace_back 的信息,因为这似乎是一个重要的用例。如果我有一个函数调用返回一个值,并且我想将它存储在一个数组中,如何确保对象直接在数组中实例化? vec.emplace_back(mkobj());? `obj&& o=mkobj(); vec.emplace_bac(std::move(o))``?什么时候有必要,我什么时候可以确定它已经被优化了?

标签: c++ emplace


【解决方案1】:

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

是的。

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

您已经正确识别出st 是一个左值,所以它被复制了。

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

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

【讨论】:

  • 所以让我提供更多背景知识,因为我不确定我是否以最佳方式执行此操作。在调用add_state 时,我必须将lvalue 转换为xvalue 并将其传递给add_state。请注意,传递给add_state 的参数将永远不会再次使用。然后在add_state 中,我必须执行另一个std::move,正如你刚才所说。所以这是2个动作。如果我简单地通过普通的香草引用传递左值,然后将它移动到函数中,我可以实现相同的行为吗?在这种情况下,我只会执行 1 步?我会将其编辑到 OP 中以使其更清晰。
猜你喜欢
  • 2017-01-12
  • 1970-01-01
  • 2015-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多