Пакет параметров Повторение в обратном направлении при оценке функции в списке аргументов - PullRequest
0 голосов
/ 21 декабря 2018

Я изучаю упаковку параметров в C ++ и смущен выводом этого фрагмента:

template<typename... Ts>
void f1(Ts... args)
{
    std::cout << "------------------------" << std::endl;
    int dummy[sizeof...(Ts)] = { (std::cout << args << std::endl, 0)... };
    std::cout << "------------------------" << std::endl;
}

template<typename Tout, typename T>
Tout f2(T arg)
{
    std::cout << arg << std::endl;
    return 2.0 * (Tout)arg;
}

template<typename... Ts>
void f3(Ts... args)
{
    f1(f2<double>(args)...);
}

int main()
{
    f1(1, 2, 3);    
    f3(1, 2, 3);
}

Вывод на моем компьютере показан ниже с выделением важных строк

------------------------
1
2
3
------------------------
3   <<< GOING BACKWARDS >>>
2
1
------------------------
2
4
6
------------------------

Мне кажется, что оценка f2<double>(args)... внутри f3 идет назад, но затем переворачивается для выполнения f1.Из прочитанного мною чтения я подумал, что упаковка параметров гарантированно будет в порядке, поэтому это очень удивительно.

Это минимальный пример более крупного проекта, в котором он действительно важен.чтобы f2 был выполнен по порядку.Есть ли какой-то способ, которым я могу заставить его не изменить порядок или, по крайней мере, я гарантирую, что он всегда будет идти назад?

...