折叠表达式
更新时间:2026-10-01。是 05 变参模板 的现代简化写法。
一、四种形态
cpp
template<class... A> auto sum(A... a) { return (a + ...); } // 一元右折
template<class... A> auto sum0(A... a){ return (a + ... + 0); } // 二元右折,空包得0
template<class... A> void print(A... a){ ((std::cout << a), ...);} // 逗号左折副作用二、规则与用途
(... && checks<Ts>) 要求全部满足;空包时 &&→true、||→false、逗号→void(),其它运算符空包通常 UB/报错,必要时给初始值。

常见坑
- 空包展开非特殊运算符导致格式错误/UB。
<<优先级与折叠括号混淆,用逗号包一层。- 右折对大包可能深递归实例化。
小结
总结
C++17 折叠表达式把变参模板的展开压缩成一行:一元右折 (pack op ...)、一元左折 (... op pack)、以及带初值的二元形式;逗号折叠可执行逐个副作用(打印每个参数)、&&/|| 可合并判断、+ 可求和;空包有专门规则(&&→true、||→false、逗号→void),其它运算符空包通常 UB/报错,所以必要时用二元形式给初始值,并注意运算符优先级(如 << 要用逗号包一层)和右折对大参数包的深递归实例化。