转换为函数指针
如果 lambda 的捕获列表为空,则 lambda 会隐式转换为函数指针,该函数指针采用相同的参数并返回相同的返回类型:
auto sorter = [](int lhs, int rhs) -> bool {return lhs < rhs;};
using func_ptr = bool(*)(int, int);
func_ptr sorter_func = sorter; // implicit conversion
也可以使用一元加运算符强制执行此类转换:
func_ptr sorter_func2 = +sorter; // enforce implicit conversion
调用此函数指针的行为与在 lambda 上调用 operator()
完全相同。这个函数指针绝不依赖于源 lambda 闭包的存在。因此它可能比 lambda 闭合更长寿。
此功能主要用于将 lambda 用于处理函数指针的 API,而不是 C++函数对象。
Version >= C++ 14
对于具有空捕获列表的通用 lambda,也可以转换为函数指针。如有必要,将使用模板参数推导来选择正确的特化。
auto sorter = [](auto lhs, auto rhs) { return lhs < rhs; };
using func_ptr = bool(*)(int, int);
func_ptr sorter_func = sorter; // deduces int, int
// note however that the following is ambiguous
// func_ptr sorter_func2 = +sorter;