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具有可变参数。不知何故,编译器能够将 lambda 转换为bar中的 std::function 。
据我了解,模板类型推导不考虑类型转换。所以不应该都失败吗?