Ответ 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, который поднял исходный вопрос в первую очередь и дал мне возможность решить эту потенциально обманчивую проблему.суб >