我上课
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())
)
}
问题:我需要右值参考吗?与在这里使用简单参考有什么区别吗?
答案 0 :(得分:0)
在您的情况下:
for (auto&& p: getSomePerson()) {
for (auto& p: getSomePerson()) {
这两行完全相同。
auto&&
是转发参考。会根据其初始化内容推断出它是右值还是左值引用。
要遍历的范围是vector类型的右值。其迭代器的operator*
返回左值引用。
因此p
将是对Person
的左值引用。
auto&&
在这里(以及许多其他地方)可以解释为“我不在乎绑定的内容,但不制作任何多余的副本”。对于for(:)
循环,这是一个合理的默认值。
如果范围返回值,则auto&&
将成为右值引用,并且将发生引用生存期延长。 auto&
将无法编译。
auto const&
是这里的另一个合理选择;它很像auto&&
,但您也保证不会修改您所指的内容。