В вашем случае:
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&&
, но вы также обещаете не изменять то, на что вы ссылаетесь.