测试C++2011中的Lambda Expression是否具有闭包特性
C++2011引入了Lambda Expression机制。本来在草案提案中还有Lambda Function,即命名的Lambda,但后来被取消了。我们这次来测试一下C++2011标准中的Lambda是否具有真正意义上的闭包特性。
由于C++2011中的Lambda表达式仅给出了Lambda实体的声明方式,而没有对象类型声明方式(在Apple LLVM编译器中所引入的Blocks机制中,这两种方式均有),因此要将一个函数的Lambda对象给引出来相对来说要麻烦一些。这里,我们使用了function标准库作为辅助。
//============================================================================ // Name : testCPP.cpp // Author : Zenny Chen // Version : // Copyright : Your copyright notice // Description : Hello World in C++, Ansi-style //============================================================================ #include <stdio.h> #include <iostream> #include <functional> #include <vector> #include <typeinfo> using namespace std; static function<void(void)> __attribute__((noinline)) MyTest(void) { int a = 100; int b = 200; printf("The address of a is: 0x%.16lX\n", (unsigned long)&a); printf("The address of b is: 0x%.16lX\n", (unsigned long)&b); auto lam = [b, &a](void) -> void { a += 1000; printf("The value is: %d\n", a + b); printf("The address of a is: 0x%.16lX\n", (unsigned long)&a); printf("The address of b is: 0x%.16lX\n", (unsigned long)&b); }; function<void(void)> fun = lam; return fun; } int main() { auto lam = MyTest(); lam(); cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!! lam(); return 0; }
以上代码基于Ubuntu 12.04中的G++编译器,由于还是4.6.x,因此C++标准仍然是草案中的C++0x名称。这个版本测出来,C++0x的Lambda表现形式与Apple所引入的Blocks机制的行为完全一致,不具备真正意义上的闭包特性。