右值引用用法:需要吗?

rvalue reference usage: needed?

我有一个class

class Person {
  // some other fields for this object
  std::vector<string> relatives;
}

然后是一个 util 函数,其中 returns 一个 Person

列表
std::vector<Person> getSomePerson() {
  // implementation details...
}

现在我要循环:

for (auto&& p: getSomePerson()) {  <---- do I need the rvalue reference???
  // use p
  some_other_vector.insert(
      std::make_move_iterator(p.relatives.begin()),
      std::make_move_iterator(p.relatives.end())
  )
}

问题:我需要右值引用吗?它与在此处使用简单参考有什么区别吗?

你的情况:

for (auto&& p: getSomePerson()) {
for (auto& p: getSomePerson()) {  

这两行完全相同。

auto&&这里是转发参考。它将根据初始化的内容推断为右值或左值引用。

正在迭代的范围是向量类型的右值。它的迭代器的 operator* returns 是一个左值引用。

因此 p 将是对 Person 的左值引用。

auto&& 可以在这里(以及许多其他地方)解释为 "I do not care what I am binding to, but don't make any extra copies"。这是 for(:) 循环的合理默认值。

如果您的范围返回值,auto&& 将成为右值引用,并且引用生命周期会延长。 auto& 将无法编译。

auto const& 是另一个合理的选择;它很像 auto&&,但您也保证不会修改您所指的内容。