Ссылочное использование: необходимо? - PullRequest
1 голос
/ 28 мая 2019

У меня есть класс

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

, а затем утилита, которая возвращает список 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?Имеет ли это какое-то значение, чем использование простой ссылки здесь?

1 Ответ

0 голосов
/ 28 мая 2019

В вашем случае:

for (auto&& p: getSomePerson()) {
for (auto& p: getSomePerson()) {  

эти две строки полностью идентичны.

auto&& вот ссылка для пересылки. Он будет выводиться как ссылка rvalue или lvalue в зависимости от того, с чем он инициализируется.

Итерируемый диапазон является значением типа vector. Его итератор operator* возвращает ссылку на lvalue.

Таким образом, p будет lvalue ссылкой на Person.

auto&& можно интерпретировать здесь (и во многих других местах) как «Мне все равно, с чем я связан, но я не делаю никаких дополнительных копий». Это разумное значение по умолчанию для цикла for(:).

Если ваш диапазон вернул значения, auto&& станет ссылкой на rvalue, и произойдет продление срока жизни ссылки. auto& не скомпилируется.

auto const& - еще один разумный вариант здесь; это очень похоже на auto&&, но вы также обещаете не изменять то, на что вы ссылаетесь.

...