C++ Lambda闭包的思考
本来想研究golang中的闭包的,但是不知怎么思路就跑到这来了……
关于闭包的概念,我认为这里讲解的最好:
闭包是由函数和与其相关的引用环境组合而成的实体。比如参考资源中就有这样的的定义:在实现深约束(注)时,需要创建一个能显式表示引用环境的东西,并将它与相关的子程序捆绑在一起,这样捆绑起来的整体被称为闭包。
早在C++11开始就支持了Lambda闭包,使用的姿势大概是这样的
1 2 3 4 5 6 7 8 9 10 11 |
#include <iostream> std::function<void()> getClosure() { int v = 0; return [v]() mutable { std::cout << v++ << std::endl; }; } int main() { auto c = getClosure(); c(); // 0 c(); // 1 } |
与我们所常听到的javascript的闭包别无二致,局部变量v可以在其作用域外被访问,实现了累加的效果。但是到这里我们不禁要问一个问题:C++函数中的变量(除了new出来的)都是分配在栈上的,但是函数退出后栈空间被销毁,那么这个v在哪?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#include <cstdio> #include <iostream> std::function<void()> getClosure() { int v = 0 |