Я нашел эту информативную статью , которая поможет вам:
Я думаю, что приведенная ниже цитата из статьи отвечает на ваш вопрос:
В цикле for
на основе диапазона auto&
создаст ссылки (множественное число) на исходные элементы в диапазоне.
Также рассматриваются различные способы использования auto
в цикле for на основе диапазона.
for (auto x : range)
Это создаст копию каждого элемента в диапазоне. Поэтому используйте этот вариант, если вы хотите работать с копией.
for (const auto x : range)
Использование const auto
может означать, что вы хотите работать с неизменяемой копией каждого элемента.
for (auto& x : range)
Используйте auto&
, если вы хотите изменить элементы в диапазоне в неуниверсальном коде.
for (const auto& x : range)
Используйте const auto&
, если вам нужен доступ только для чтения к элементам в диапазоне, даже в общем коде
for (auto&& x : range)
Используйте auto&&
, если вы хотите изменить элементы в диапазоне в общем коде
for (const auto&& x : range)
Этот вариант будет привязан только к значениям, которые вы не сможете изменить или переместить из-за констант. Это делает его менее чем бесполезным. Следовательно, нет причин выбирать этот вариант вместо const auto&
.
for (decltype(auto) x : range) // C++14
Это означает: применять автоматическое вычитание типа, но использовать decltype
правила. Принимая во внимание, что auto удаляет cv
квалификаторы и ссылки верхнего уровня, decltype
сохраняет их.