Kwa*_*wan 4 c++ lambda templates
这是示例代码
#include <iostream>
template<typename T>
T foo(T(*fp)())
{
return fp();
}
int main()
{
std::cout<<foo([]->int{ return 1; });
}
Run Code Online (Sandbox Code Playgroud)
当我编译上面的代码时,编译器说它不能推导出模板参数,但我已经指定了 lambda 的返回类型。
foo需要函数指针,而你传递一个lambda,但隐式转换(从lambda来函数指针)将不被视为模板参数推导的T,这使得调用失败。
类型推导不考虑隐式转换(上面列出的类型调整除外):这是重载解析的工作,稍后发生。
您可以明确指定模板参数:
foo<int>([]()->int{ return 1; });
// ^^^^^
Run Code Online (Sandbox Code Playgroud)
或通过operator+或将 lambda 转换为函数指针static_cast。
foo(+[]()->int{ return 1; });
// ^
foo(static_cast<int(*)()>([]()->int{ return 1; }));
// ^^^^^^^^^^^^^^^^^^^^^^ ^
Run Code Online (Sandbox Code Playgroud)
顺便说一句:与尾随返回类型一起使用的省略参数列表是 C++23 lambda功能。(所以我添加了()s。)正如@max66 所建议的,没有尾随返回类型,lambda 也可以正常工作;将自动推导出返回类型,例如foo(+[]{ return 1; });.
| 归档时间: |
|
| 查看次数: |
97 次 |
| 最近记录: |