如何从lambda推导返回类型?C++模板参数推导失败求解
问题原因
无捕获的lambda虽然支持隐式转换为同签名的函数指针,但模板参数推导阶段不会考虑任何隐式转换操作,只会匹配实参和形参的精确类型。你传入的lambda实参本质是匿名类类型,和形参的函数指针类型T(*)()不匹配,因此编译器无法推导出模板参数T的具体类型,和你是否显式指定lambda返回类型无关。
解决方案
你可以选择以下任意一种方案解决问题:
- 方案1:调用时手动将lambda转换为函数指针,跳过推导阶段的类型匹配校验
可以用static_cast显式转换:
也可以用更简便的std::cout << foo(static_cast<int(*)()>([]() -> int { return 1; }));+运算符触发转换(无捕获lambda内置operator+重载,返回对应函数指针):std::cout << foo(+[]() -> int { return 1; }); - 方案2:调用时显式指定模板参数
T的类型std::cout << foo<int>([]() -> int { return 1; }); - 方案3:修改
foo的模板定义,直接接受任意可调用类型,自动推导返回值,不再依赖函数指针形参
C++11版本实现:
C++14及以上版本可以简化为:template<typename F> auto foo(F fp) -> decltype(fp()) { return fp(); }template<typename F> decltype(auto) foo(F fp) { return fp(); }
内容的提问来源于stack exchange,提问作者Kwan
相关产品推荐
相关产品推荐

