说我有这个功能:
template <typename T>
void foo(function<T(const T&, const T&)> op, const T& lhs, const T& rhs) {
cout << op(lhs, rhs) << endl;
}
这是legal code:
function<int(const int&, const int&)> op = plus<int>();
foo(op, 13, 42);
但是当我这样做时:
foo(plus<int>(), 13, 42)
我收到错误:
调用
时没有匹配功能foo(std::plus<int>, int, int)
为什么我可以从function<int(const int&, const int&)>
初始化plus<int>()
类型的对象,但我无法将plus<int>()
传递给function<T(const T&, const T&)>
类型的参数?是否与模板有关?
答案 0 :(得分:2)
引自标准部分14.8.1.6:
将对某个函数执行隐式转换(第4条) 将其转换为相应函数类型的参数 参数类型不包含模板参数的参数 参与模板参数演绎。
这在您的情况下不起作用,因为未明确提供模板参数。编译器需要进行演绎。因此,根据上述内容,它不会从仿函数到std::function
进行隐式转换。
所以,你可以这样做(正如@flatmouse在评论中提到的那样):
foo<int>(plus<int>(), 13, 42);
这是有效的,因为没有需要执行的模板参数推导,因为显式指定了所有模板参数。根据标准的上述引用,隐式转换应该适用于此。