Lambda выводится в std :: function, если шаблон не имеет переменных аргументов
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 а такжеба в том, что Foo имеет переменные аргументы. Каким-то образом компилятор может преобразовать лямбду в std :: function вба.
Насколько я понимаю, вычитание типа шаблона не учитывает преобразования типов. Так не должны ли оба потерпеть неудачу?