Ранжированная база для цикла по временной ссылке C ++ 11 - PullRequest
0 голосов
/ 31 мая 2018

Мне интересно, верно ли следующее:

#include <iostream>
#include <vector>

std::vector<int>& getVec()
{
    static std::vector<int> vec{1, 2, 3, 4, 5};
    return vec;
}

int main()
{
    for (const auto& i : getVec())
    {
        std::cout << "i = " << i << std::endl;
    }
    return 0;
}

По сути, я не уверен в сроке жизни временного с getVec().Я посмотрел как этот пост , так и этот пост , но у меня немного другая ситуация, так как моя функция возвращает ссылку на static данные.В частности, мне интересно, нарушает ли сценарий следующее исключение в указанном правиле:

  • Временная привязка к ссылочному параметру в вызове функции [...]

или, если это действительно безопасный код.Я думаю, что это безопасно, но просто хотел быть уверен.

1 Ответ

0 голосов
/ 31 мая 2018

Да, это полностью допустимо и четко определено.

Цикл 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>&&, и будет применено продление времени жизни.Это продлило бы время жизни временного объекта до срока действия ссылки, и все было бы полностью в силе.

...