【发布时间】:2012-04-19 10:21:57
【问题描述】:
我在看“How to properly use references with variadic templates”,想知道逗号扩展能走多远。
这是答案的变体:
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”括在括号中,和/或使用后增量;均未奏效。)
【问题讨论】:
-
你用可变参数模板参数定义了operator+吗?
-
查找关于可变参数模板的维基百科文章。前段时间,我在文章中添加了一些关于此类扩展的技术。