转换为函数指针

如果 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;