右值参考用法:是否需要?

时间:2019-05-28 17:57:30

标签: c++ c++14 rvalue-reference rvalue

我上课

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

然后是一个util函数,该函数返回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())
  )
}

问题:我需要右值参考吗?与在这里使用简单参考有什么区别吗?

1 个答案:

答案 0 :(得分:0)

在您的情况下:

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

这两行完全相同。

auto&&是转发参考。会根据其初始化内容推断出它是右值还是左值引用。

要遍历的范围是vector类型的右值。其迭代器的operator*返回左值引用。

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

auto&&在这里(以及许多其他地方)可以解释为“我不在乎绑定的内容,但不制作任何多余的副本”。对于for(:)循环,这是一个合理的默认值。

如果范围返回值,则auto&&将成为右值引用,并且将发生引用生存期延长。 auto&将无法编译。

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

相关问题