T240104 Failed to Passing a Lambda Expression to std::function
这是昨天群里的一个问题,但我想谈的是背后的本质问题。 这个问题其实可以简化为: template <typename …Args> void foo(std::function<bool(Args…)>) { } int main() { // error: no matching function for call to 'foo(main()::<lambda(int)>)' foo([](int) { return true; }); } 本质原因在 TAD(模板参数推导),这里实参 A = closure type,形参 P = std::function<bool(Args…)>。由于类型完全不同,P 无法替换成 A,这里 TAD 完全不可能推断出 Args… 的类型。于是,模板函数因模板替换失败,而被早早移除,连一级筛选 Candidate functions 都未能进入。 不用 std::function 可能更易理解。一个例子: template <class… Continue Reading T240104 Failed to Passing a Lambda Expression to std::function