Да, это полностью допустимо и четко определено.
Цикл for, основанный на диапазоне, в вашем вопросе определяется как эквивалентный следующему, для мнимых переменных range
, begin
иend
:
auto&& range = getVec();
auto begin = std::begin(range);
auto end = std::end(range);
for (; begin != end; ++begin)
{
const auto& i = *begin;
{
std::cout << "i = " << i << std::endl;
}
}
После применения правил свертывания ссылок тип range
становится std::vector<int>&
.Это означает, что временные создания никогда не создаются.Цикл повторяется по статическому вектору, определенному в getVec
.
Если вместо значения getVec
возвращено значение, тип range
будет std::vector<int>&&
, и будет применено продление времени жизни.Это продлило бы время жизни временного объекта до срока действия ссылки, и все было бы полностью в силе.