折叠表达式:左折叠,右折叠

发布时间:2026/5/19 11:00:36

折叠表达式:左折叠,右折叠 关于何为左右折叠表达式可以直接通过 C Insights (C Insights) 来进行查看原理。左折叠template typename... Args auto getSum(Args... args) { return (args ...); } int main() { getSum(1, 2, 3, 4, 5); } template typename... Args auto getSum(Args... args) { return (args ...); } #ifdef INSIGHTS_USE_TEMPLATE template int getSumint, int, int, int, int(int __args0, int __args1, int __args2, int __args3, int __args4) { return __args0 (__args1 (__args2 (__args3 __args4))); } #endif int main() { getSum(1, 2, 3, 4, 5); return 0; }右折叠template typename... Args auto getSum(Args... args) { return (... args); } int main() { getSum(1, 2, 3, 4, 5); } template typename... Args auto getSum(Args... args) { return (... args); } #ifdef INSIGHTS_USE_TEMPLATE template int getSumint, int, int, int, int(int __args0, int __args1, int __args2, int __args3, int __args4) { return (((__args0 __args1) __args2) __args3) __args4; } #endif int main() { getSum(1, 2, 3, 4, 5); return 0; }可见折叠表达式是在单个函数内部对形参包进行展开通过使用小括号的不断嵌套达到最终效果。其中左侧元素先套括号则为左折叠右侧元素先套括号则为右折叠。所以当使用折叠表达式时需要考虑到左右展开所导致的运算合理性。我们看如下的这个例子#include iostream #include string template typename... Args auto getSum0(Args... args) { // 左折叠 return (... args); } template typename... Args auto getSum1(Args... args) { // 右折叠 return (args ...); } int main() { auto sum0 getSum0(std::string(Hello ), World , !!! ); // 编译失败 // auto sum1 getSum1(std::string(Hello ), World , !!! ); }

相关新闻