...
必须放在函数调用括号内:
print_one<Args>::run(std::forward<Args>(args)...);
显然,这不适用于仅采用单个参数的函数,因此您需要找到一种方法将调用扩展为函数调用或其他允许的构造:
// constructing a dummy array via uniform initialization
// the extra 0 at the start is to make it work when the pack is empty
int dummy[]{0, (print_one<Args>::run(std::forward<Args>(args)), 0)...};
// or, if your compiler doesn't support uniform initialization
int dummy[] = {0, (print_one<Args>::run(std::forward<Args>(args)), 0)...};
// or, calling a dummy function
template<typename... Args> void dummy(Args...) {}
dummy((print_one<Args>::run(std::forward<Args>(args)), 0)...);
// or, constructing a temporary dummy object
struct dummy { dummy(std::initializer_list<int>) {} };
dummy{(print_one<Args>::run(std::forward<Args>(args)), 0)...};
// or, constructing a temporary initializer list
std::initializer_list<int>{(print_one<Args>::run(std::forward<Args>(args)), 0)...};
请注意使用逗号运算符将void
返回print_one
值转换为适合放置在参数列表或初始化表达式中的值。
初始化列表形式优于函数调用形式,因为它们(应该是)有序的 LTR,而函数调用参数不是。
14.5.3 [temp.variadic] 涵盖了可能发生参数包扩展的形式:
4 - [...] 包扩展可能发生在以下情况下:
您的原始代码是非法的,因为尽管从文本上看,它可能会生成一个由多个逗号运算符表达式组成的语句,但这不是 14.5.3:4 所允许的上下文。