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

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

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

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

9

Решение

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

Реализация выражения сгиба производит:

(9.1) — ((E1 оп E2) оп … ·) оп 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 — это оператор сгиба, 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 который поднял первоначальный вопрос и дал мне возможность решить эту проблему потенциально вводит в заблуждение вопрос.

8

Другие решения


По вопросам рекламы [email protected]