Посмотрите на этот фрагмент кода
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()… о, подождите… Пакет параметров пуст, а функция print() принимает 1 параметр.
Почему тогда он оценивается как auto x = {0};
?
Почему компилятор не выдает ту же ошибку, что и раньше?