【发布时间】:2016-12-22 23:42:10
【问题描述】:
对于以下代码:
#include<functional>
template<typename T>
void f(std::function<void(T)> g) {
}
template<typename T>
void g(T x) {
}
int main() {
f(&g<int>);
}
C++14 编译器产生错误:
no matching function for call to 'f(<unresolved overloaded function type>)'
f(&g<int>);
我很好奇为什么模板参数推导在这里不起作用。
看来,鉴于 g 的参数是 int 类型,我们可以推断 f 的参数是 std::function<void(int)> 类型,因此在 f 中是 T = int。为什么这不会发生?我对解释这一点的 C++ 标准的相关部分感兴趣。 T 是否出现在此处的非推导上下文中?
以下类似代码编译:
#include<vector>
template<typename T>
void f(std::vector<T> vec) {
}
int main() {
f(std::vector<int>{});
}
所以不是尖括号创建了非推断上下文。
【问题讨论】:
-
f(std::function<void(int)>(g<int>));工作 -
xis,谢谢。实际上, f
(&g );也可以。我的问题是我无法根据标准中的内容来解释这些行为。
标签: c++ templates c++14 template-argument-deduction