у меня есть класс
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())
)
}
Вопрос: нужна ли мне ссылка на rvalue? Имеет ли это какое-то значение, чем использование здесь простой ссылки?
getSoemPerson()
является rvalue. Это не.
Слишком мало информации для правильного ответа. Я понятия не имею, нужна ли вам ссылка rvalue или нет, основываясь на предоставленной информации.
обновлено, нужно ли использовать ссылку rvalue или подойдет простая ссылка? Я так понимаю, он все равно сделает копию?
В твоем случае:
for (auto&& p: getSomePerson()) {
for (auto& p: getSomePerson()) {
эти две строки полностью идентичны.
auto&&
вот ссылка на переадресацию. Будет сделан вывод, что это ссылка на rvalue или lvalue в зависимости от того, чем она инициализирована.
Диапазон, по которому выполняется итерация, представляет собой rvalue типа vector. Его итератор operator*
возвращает ссылку lvalue.
Таким образом, p
будет ссылкой lvalue на Person
.
auto&&
можно интерпретировать здесь (и во многих других местах) как "Мне все равно, к чему я привязываюсь, но не делайте лишних копий". Это разумное значение по умолчанию для цикла for(:)
.
Если бы ваш диапазон возвращал значения, auto&&
стал бы ссылкой на rvalue, и произошло бы продление жизни ссылки. auto&
не скомпилируется.
auto const&
— еще один разумный вариант; это очень похоже на auto&&
, но вы также обещаете не изменять то, о чем говорите.
Это Ссылка на пересылку.