Подтвердить что ты не робот

Почему левое выражение не инвертирует вывод правильного складчатого выражения?

Я смотрю на С++ 17 fold выражения, и мне интересно, почему следующие программы выходят

4 5 6 
4 5 6 

для обоих вызовов for_each

template<typename F, typename... T>
void for_each1(F fun, T&&... args)
{
    (fun (std::forward<T>(args)), ...);
}

template<typename F, typename... T>
void for_each2(F fun, T&&... args)
{
    (..., fun (std::forward<T>(args)));
}

int main()
{
     for_each1([](auto i) { std::cout << i << std::endl; }, 4, 5, 6);
     std::cout << "-" << std::endl;
     for_each2([](auto i) { std::cout << i << std::endl; }, 4, 5, 6);
}

Живой пример

Я думал, что второе сглаженное выражение предназначено для вывода чисел в обратном порядке

6 5 4

Почему результаты одинаковы?

4b9b3361

Ответ 1

Согласно § 14.5.3/9

В результате создания выражения сложения получается:

(9.1) - ((E1 op E2) op ···) op EN для унарной левой складки,

(9.2) - E1 op (··· op (EN-1 op EN)) для унарной правой складки,

(9.3) - (((E op E1) op E2) op ···) op EN для двоичной левой складки и

(9.4) - E1 op (··· op (EN-1 op (EN op E))) для двоичной правой складки

В каждом случае op является оператором fold, N - количество элементов в параметрах расширения пакета, и каждый Ei генерируется путем создания экземпляра шаблона и замены каждого параметра расширения пакета его i-м элементом.

в приведенном выше коде они являются и унарными выражениями сглаживания, и их расширение

template<typename F, typename... T>
void for_each1(F fun, T&&... args) {

    // Unary right fold (fun(args_0) , (fun(args_1) , (fun(args_2) , ...)))
    (fun (std::forward<T>(args)), ...);
}

template<typename F, typename... T>
void for_each2(F fun, T&&... args) {

    // Unary left fold ((fun(args_0) , fun(args_1)) , fun(args_2)) , ...
    (..., fun (std::forward<T>(args))); 
}

поэтому выражения имеют тот же порядок оценки, который определяется запятой, и, следовательно, вывод одинаков.

Кредиты: благодаря моему другу Marco, который поднял исходный вопрос в первую очередь и дал мне возможность решить эту потенциально обманчивую проблему.суб >