関数テンプレートを次のように書いていました
template<typename ...T>
void f(T ...t) {
X x(t...);
// ...
}
それを見ていると、コールはどうなるのだろうと思っていたf()
。煩わしい解析は xa 関数宣言を行いますか? コンパイラはそれを変数にするようです。誰かが私がそれについて確信するのを手伝ってくれますか?
関数テンプレートを次のように書いていました
template<typename ...T>
void f(T ...t) {
X x(t...);
// ...
}
それを見ていると、コールはどうなるのだろうと思っていたf()
。煩わしい解析は xa 関数宣言を行いますか? コンパイラはそれを変数にするようです。誰かが私がそれについて確信するのを手伝ってくれますか?
空の括弧(()
)は、ソースコードにそのように記述されている場合にのみ、関数宣言になります。
§14.5.3 [temp.variadic] p6
これについても言及しています:
sizeof ...式ではないパック拡張のインスタンス化により、リストE1、E2、...、ENが生成されます。ここで、Nはパック拡張パラメーター内の要素の数です。[...] Nがゼロの場合、展開のインスタンス化により空のリストが生成されます。このようなインスタンス化は、リストを完全に省略すると形式が正しくない場合や文法があいまいになる場合でも、囲んでいる構文の構文上の解釈を変更しません。[例:
template<class... T> struct X : T... { }; template<class... T> void f(T... values) { X<T...> x(values...); } template void f<>(); // OK: X<> has no base classes // x is a variable of type X<> that is value-initialized
—例を終了]
特にサンプルコードの2番目のコメントを参照してください。