我发现MSVC和GCC中的lambdas都是实现operator()
的函子。他们更喜欢函子指针函数的原因是什么?
答案 0 :(得分:24)
问题是C ++中的lambda函数可以有一个额外的状态(捕获的变量,也就是上下文),必须为每个实例传递它们(它们可以因为同一个lambda函数的句柄的每个实例而不同)。 / p>
函数不能将状态耦合到您传递的句柄。如果你要将这样的状态添加到函数指针中,你最终会编写一个需要使用括号语法(operator()
)来调用的包装器,它恰好是一个仿函数。
一个值得注意的事实是,没有捕获的lambda 可以转换为函数指针。这是唯一可能的,因为不需要这样的额外空间。
答案 1 :(得分:9)
函数没有状态,因此它们无法实现lambdas所需的功能。
此外,你可以保证lambdas有一个独特的类型,你不能单独使用它。
答案 2 :(得分:4)
除了已经提到的捕获能力之外,性能也是一个原因。通常,函数指针不能内联。仿函数可以。这就是为什么std :: sort比qsort快。如上所述,没有捕获的lambda可以转换为函数指针,但这主要是与旧的c api进行交互。即所以你可以将lambda传递给旧的win32 api函数。一般来说,对于一个简单的lambda,编译器更喜欢内联它。