「可変引数テンプレートで参照を適切に使用する方法」を見ていて、カンマ展開がどこまでできるのか疑問に思いました。
答えの変形は次のとおりです。
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」が空の場合、句読点の無効な塊が得られるためですか? それは合法ですか、私のコンパイラは十分ではありませんか?
(「引数」を括弧で囲んだり、ポストインクリメントを使用したりしましたが、どちらも機能しませんでした。)