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 вба.

Насколько я понимаю, вычитание типа шаблона не учитывает преобразования типов. Так не должны ли оба потерпеть неудачу?

Ответы на вопрос(2)

Ваш ответ на вопрос