c++ - 右值引用用法 : needed?

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

我有课

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

然后是一个返回 Person 列表的 util 函数

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&& 这里是转发引用。它将根据初始化的内容推断为右值或左值引用。

正在迭代的范围是 vector 类型的右值。它的迭代器的 operator* 返回一个左值引用。

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

auto&& 可以在这里(以及许多其他地方)解释为“我不关心我绑定(bind)到什么,但不要制作任何额外的拷贝”。这是 for(:) 循环的合理默认值。

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

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

关于c++ - 右值引用用法 : needed?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56347712/

相关文章:

c++ - 如何将结构与字符串键链接起来?

c++ - 使用 VS2015 CLR 在 CDialog 派生类上创建返回 0,在 VC++ 6 中运行良好

c++ - std::function 性能与模板相比

c++ - 如何 move std::ostringstream 的底层字符串对象?

c++ - 可以接收 T、T& 和 T&& 中的任何一个作为输入的函数,并且还可以识别其类型?

c++ - 右值引用和 std::move

c++ - 自 1.56 以来,boost/interprocess/detail/tmp_dir_helpers.hpp 不再出现在 boost 中

c++ - 当使用对象在虚拟方法中调用虚拟方法时,应该发生虚拟分派(dispatch)吗?

c++ - 可恢复函数限制背后的基本原理

c++ - shared_ptr SIGSEGV 中的无序映射