C++ 为什么C++;lambda是用functor而不是函数指针实现的?

C++ 为什么C++;lambda是用functor而不是函数指针实现的?,c++,lambda,C++,Lambda,我发现MSVC和GCC中的lambda都是实现操作符()的函子。什么是他们更喜欢函数函数指针的原因? 问题是C++中的lambda函数可以有一个附加的状态(捕获变量AKA上下文),每个实例必须被传递(它们对于句柄的每个实例对于相同的lambda函数来说都是不同的)。 函数的状态不能与传递的句柄耦合。如果要将这样的状态添加到函数指针,那么最终将编写一个包装器,该包装器需要使用括号语法(operator())调用,而括号语法恰好就是函子 一个值得注意的事实是,没有捕获的lambda可以转换为函数指针

我发现MSVC和GCC中的lambda都是实现
操作符()
的函子。什么是他们更喜欢函数函数指针的原因?

问题是C++中的lambda函数可以有一个附加的状态(捕获变量AKA上下文),每个实例必须被传递(它们对于句柄的每个实例对于相同的lambda函数来说都是不同的)。 函数的状态不能与传递的句柄耦合。如果要将这样的状态添加到函数指针,那么最终将编写一个包装器,该包装器需要使用括号语法(
operator()
)调用,而括号语法恰好就是函子


一个值得注意的事实是,没有捕获的lambda可以转换为函数指针。这是因为它不需要额外的空间。

函数没有状态,因此无法实现lambdas所需的功能


此外,您还可以保证lambda具有唯一的类型,而单靠函数是无法做到这一点的。

除了前面提到的捕获功能之外,性能也是一个原因。通常,函数指针不能内联。函子可以是。这就是为什么std::sort比qsort快的原因。如前所述,没有捕获的lambda可以转换为函数指针,但这主要是为了与旧的c api交互。i、 因此,您可以将lambda传递给旧的win32 api函数。一般来说,对于一个简单的lambda,编译器更倾向于内联它。

因为标准这么说?他们也需要空间来捕获。我确实读过一个建议,将捕获lambda转换添加到函数指针,其有效期与闭包实例相同。在大多数体系结构中,这实际上是可能的,方法是写入包含机器语言指令和指向lambda的指针的数据,然后将其标记为可执行文件,然后返回指向您在运行时刚刚创建的函数的指针。我不知道该提案的状态是什么。@Yakk还是简单地使用一个全局变量?;)(事实上,这就是我在编辑我的答案时添加第一段最后一部分的原因。)具有不同捕获状态的lambda的多个实例随后无法工作。基本上,在许多平台上,我们可以生成状态存储在它们指向的代码中的函数指针,并且有许多遗留API不提供有状态回调对。@Yakk-Oh我不完全理解你的意思。现在我明白了。但对我来说,听起来像是一个黑客。。。另外,有些(重要的)体系结构不允许这种afaik(iOS?),但我可能错了。