如何遍历可变参数列表?不解{(Print(Param),0)...}中0的作用
可变参数遍历中
(Print(Param),0)里0的作用解析 核心原因:数组初始化需要合法的数值类型
这是C++11及更早版本里,没有折叠表达式时用来遍历可变参数的实用技巧,核心是利用逗号运算符和数组初始化列表的特性:
- 逗号运算符的规则是:先执行左边的表达式(这里就是调用
Print(Param)完成打印),然后返回右边表达式的值。 - 代码里的
int arr[] = { ... }要求初始化列表的每个元素必须是能转换成int的有效值,但Print函数返回类型是void——void没有实际值,根本没法作为数组元素的初始化值。
所以这里的0就是用来提供一个合法的int类型返回值,让逗号表达式整体变成int类型的有效表达式,这样数组初始化列表的每个元素都是合法的0,编译器才会接受这个写法,同时还能顺便触发左边的Print调用。
去掉0报错的原因
去掉0后,表达式变成{ Print(Param)... },展开后就是{ Print(num), Print(num), Print(num) }。每个Print(num)返回void,而int数组的元素必须是int类型,void无法转换为int,编译器会直接抛出“无法将void类型转换为int”之类的错误。
更优雅的替代写法(C++17+)
如果你的编译器支持C++17及以上,完全可以用折叠表达式实现,不需要这种数组初始化的黑科技:
template<typename ...ParamTypes> void Func(ParamTypes &...Param) { (Print(Param), ...); }
折叠表达式会自动展开可变参数,逐个调用Print,语法清晰,也不会产生多余的数组变量。
内容的提问来源于stack exchange,提问作者Crt
相关产品推荐
相关产品推荐

