template<typename ReturnT, typename... ParamT>
void foo(std::function<ReturnT(ParamT...)> callback)
{}
template<typename ReturnT, typename ParamT>
void bar(std::function<ReturnT(ParamT)> callback)
{}
main()
{
foo<int, int>([](int x){ return x; }); // no instance of function
// template matches argument list
bar<int, int>([](int x){ return x; }); // OK
}
Единственное различие между foo и bar заключается в том, что foo имеет вариативные аргументы. Как-то компилятор способен преобразовать лямбда в std :: function в bar.
Насколько я понимаю, вычет типа шаблона не учитывает преобразования типов. Так не должны ли оба терпеть неудачу?