Рассмотрим этого куска коды:Неоднозначный вызова при рекурсивном вызове функции VARIADIC шаблона перегрузки
template<typename FirstArg>
void foo()
{
}
template<typename FirstArg, typename... RestOfArgs>
void foo()
{
foo<RestOfArgs...>();
}
int main()
{
foo<int, int, int>();
return 0;
}
Это не компилируется из-за неоднозначный вызов foo<RestOfArgs...>();
когда RestOfArgs
имеет только один элемент ({int}
).
Но это компилируется без ошибок:
template<typename FirstArg>
void foo(FirstArg x)
{
}
template<typename FirstArg, typename... RestOfArgs>
void foo(FirstArg x, RestOfArgs... y)
{
foo(y...);
}
int main()
{
foo<int, int, int>(5, 6, 7);
return 0;
}
Почему неоднозначность в первом случае?
Почему во втором случае нет двусмысленности?
Мое предположение, что это имеет какое-то отношение тот факт, что сигнатура функции является ее аргументом, и что '' и '' неразличимы в одном случае, но в другом случае. –
yeputons
Посмотрите на [overload_resolution] (http://en.cppreference.com/w/cpp/language/overload_resolution) и [Function_template_overloading] (http://en.cppreference.com/w/cpp/language/function_template#Function_template_overloading) – Jarod42
@ Jarod42 Я посмотрел на него, но до сих пор не знаю ответа на мои вопросы. –