我在看“如何正确使用可变参数模板的引用”,想知道逗号扩展能走多远。
这是答案的变体:
inline void inc() { }
template<typename T,typename ...Args>
inline void inc(T& t, Args& ...args) { ++t; inc(args...); }
由于可变参数被扩展为其元素的逗号分隔列表,这些逗号在语义上是否等同于模板/函数参数分隔符,或者它们是否按词法插入,使其适合任何(后预处理器)使用,包括逗号运算符?
这适用于我的 GCC-4.6:
// Use the same zero-argument "inc"
template<typename T,typename ...Args>
inline void inc(T& t, Args& ...args) { ++t, inc(args...); }
但是当我尝试时:
// Use the same zero-argument "inc"
template<typename T,typename ...Args>
inline void inc(T& t, Args& ...args) { ++t, ++args...; }
我不断收到解析错误,期待“;” 在“...”之前,并且“args”不会扩展其包。为什么它不起作用?是因为如果“args”为空,我们会得到一个无效的标点符号?合法吗,我的编译器不够好?
(我已经尝试在括号中包含“args”,和/或使用后增量;都没有成功。)