右值引用用法:需要吗?
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&&
,但您也保证不会修改您所指的内容。
我有一个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&&
,但您也保证不会修改您所指的内容。