【发布时间】:2016-08-26 19:30:39
【问题描述】:
我发现std::function 和类型推导有以下行为,这对我来说是出乎意料的:
#include <functional>
template <typename T>
void stdfunc_test(std::function<T(T)> func) {};
int test_func(int arg)
{
return arg + 2;
}
int main()
{
stdfunc_test([](int _) {return _ + 2;});
stdfunc_test(test_func);
}
main 中的两行都导致错误:
没有函数模板“stdfunc_test”的实例与参数列表匹配
尝试在 Visual Studio 2015 中编译时。
为什么类型推导不从函数类型中扣除模板类型,有没有解决办法?
【问题讨论】:
-
lambda 和函数指针实际上都不是
std::function- 它们可以隐式转换为std::function。 -
在推导模板变量时,是不是不考虑这样的隐式转换?
-
假设它是一个函数:
template <typename T> void stdfunc_test(T func)。然后用 SFINAE 限制模板的范围。 -
否,模板参数推导不考虑自定义转换。即使它做到了(虽然它没有) -
std::function有一堆模板化的构造函数,它们接受几乎任何东西,给予或接受。
标签: c++ templates c++11 std-function