我发现MSVC和GCC中的lambda表达式都是实现了
operator()
的函数对象。它们为什么更喜欢使用函数对象而不是函数指针呢?operator()
)可调用,这恰好是functor的含义。void*,void(*func)(void *)
有状态回调对的遗留API。 - Yakk - Adam Nevraumont函数没有状态,因此它们无法实现lambda所需的功能。
此外,您可以确保lambda具有唯一的类型,这是仅仅使用函数无法实现的。
除了已经提到的捕获能力之外,性能也是一个原因。通常情况下,函数指针无法内联。而函数对象可以内联。这就是为什么 std::sort 比 qsort 更快的原因。如前所述,没有捕获的 lambda 可以转换为函数指针,但这主要是为了与旧的 c api 交互。例如,这样您就可以将 lambda 传递给旧的 win32 api 函数。一般来说,对于简单的 lambda,编译器更愿意将其内联。