闭包语法的运行结果和我想像的不一样,讨论一下:
在mingw9.0下面的Gcc4.6.2运行:
$ g++ my.cpp -std=gnu++0x
a@a-PC ~
$ a
1
2
1
2
a@a-PC ~
$ cat my.cpp
- C/C++ code
#include<cstdio>#include<functional>using namespace std;int main(void){ auto closure=[]() { int a=0; return [&](){printf("%d\n",++a);}; }; auto f1=closure(); f1(); f1(); auto f2=closure(); f2(); f1(); return 0;}
我期望的结果是,既然f1和f2都是从闭包里面返回的,那么应该互相不影响,各自操作一个独立的 a,main函数的输出结果是1,2,1,3就对了。
但是看起来f1和f2共用了a变量,使得每次调用closure()的时候a都被重新赋值了0. 以致于打印结果是1,2,1,2
我的理解错在哪里呢?
[解决办法]
没看最新标准关于lambda表达式的描述。我想问的是当出了外层这个闭包的时候 你返回的那个闭包引用的a还能有效吗?恐怕不在有效了吧。
[解决办法]
引用了销毁的堆栈变量。
[解决办法]
a 不是 closure 的堆栈变量??
[解决办法]
你能不能贴些标准就是能够证明在使用返回的lambda表达式的时候他所引用的a还有效呢?