Использование ссылки 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())
  )
}

Вопрос: нужна ли мне ссылка на rvalue? Имеет ли это какое-то значение, чем использование здесь простой ссылки?

Это Ссылка на пересылку.

François Andrieux 28.05.2019 20:02
Дублировать? Кажется, вы предполагаете, что использование неправильно идентифицированной ссылки на rvalue связано с тем, что getSoemPerson() является rvalue. Это не.
LogicStuff 28.05.2019 20:03

Слишком мало информации для правильного ответа. Я понятия не имею, нужна ли вам ссылка rvalue или нет, основываясь на предоставленной информации.

SergeyA 28.05.2019 20:16

обновлено, нужно ли использовать ссылку rvalue или подойдет простая ссылка? Я так понимаю, он все равно сделает копию?

WhatABeautifulWorld 28.05.2019 20:19
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
90
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В твоем случае:

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&&, но вы также обещаете не изменять то, о чем говорите.

Другие вопросы по теме