このコードスニペットを見てください
template<class T>
void print(T var)
{
std::cout << var << " ";
}
template<class... Args>
void Variadic(Args... args)
{
print(args...);
}
int main()
{
Variadic();
}
コンパイルすると、次のように表示されます。
候補: テンプレート void print(T)
候補は 1 つの引数を期待していますが、0 が提供されました
そして彼は正しい。実際、パラメーター パックでは引数を指定しませんでした。
しかし、では、なぜこのコードはコンパイルされるのでしょうか?
template<class T>
void print(T var)
{
std::cout << var << " ";
}
template<class... Args>
void Variadic(Args... args)
{
auto x = {0, (print(args), 0)...};
}
int main()
{
Variadic();
}
最初に行うことは、最初の 0 をinitializer_list<>にプッシュすることです
では、先に進みましょう: コンパイラは
(print(args), 0)...
print() を呼び出そうとします… ああ、待って… Parameter Packは空で、print() 関数は 1 つのパラメーターを取ります。
では、なぜ と評価されるauto x = {0};
のでしょうか?
コンパイラが以前とまったく同じエラーを表示しないのはなぜですか?