【发布时间】:2018-08-10 12:53:20
【问题描述】:
我的问题与这个问题有些相关: Lambdas and std::function。请阅读此问题及其接受的答案。
所以,公认的答案是,下面的代码使得模板参数推导 lambda 成功,但为什么呢?
template<class T>
struct Identity{
typedef T type;//why this helps?
};
template<typename BaseT>
vector<BaseT> findMatches(vector<BaseT> search,
typename Identity<function<bool (const BaseT &)>>::type func)
{
vector<BaseT> tmp;
for(auto item : search)
{
if( func(item) )
{
tmp.push_back(item);
}
}
return tmp;
}
void Lambdas()
{
vector<int> testv = { 1, 2, 3, 4, 5, 6, 7 };
auto result = findMatches(testv, [] (const int &x) { return x % 2 == 0; });//lambda here.
for(auto i : result)
{
cout << i << endl;
}
}
int main(int argc, char* argv[])
{
Lambdas();
return EXIT_SUCCESS;
}
上面的代码可以运行,但我不知道为什么。首先,我知道 BaseT 的模板推导不会发生在 lambda 中,因为这是一个不可推导的上下文 (Identify<function<bool (const BaseT &)>>::type)。相反,BaseT 从testv 推导出为int,并且模板参数替换发生在Identity<function<bool (const BaseT &)>>::type 中。
但是接下来呢?替换后,Identity<function<bool (const BaseT &)>>::type 变成了function<bool (const BaseT &)>,但不是 lambda 表达式不是那种类型,并且模板参数推导中不会发生转换(虽然这里是模板参数替换)?
感谢您的解释!
附言我似乎知道编译器会为每个 lambda 表达式生成唯一命名的类。那么为什么 lambda 可以匹配 function<bool (const BaseT &)> 呢?
【问题讨论】:
标签: c++ lambda std-function template-argument-deduction