测试C++2011中的Lambda Expression是否具有闭包特性
2012-07-19 18:52
417 查看
C++2011引入了Lambda Expression机制。本来在草案提案中还有Lambda Function,即命名的Lambda,但后来被取消了。我们这次来测试一下C++2011标准中的Lambda是否具有真正意义上的闭包特性。
由于C++2011中的Lambda表达式仅给出了Lambda实体的声明方式,而没有对象类型声明方式(在Apple LLVM编译器中所引入的Blocks机制中,这两种方式均有),因此要将一个函数的Lambda对象给引出来相对来说要麻烦一些。这里,我们使用了function标准库作为辅助。
以上代码基于Ubuntu 12.04中的G++编译器,由于还是4.6.x,因此C++标准仍然是草案中的C++0x名称。这个版本测出来,C++0x的Lambda表现形式与Apple所引入的Blocks机制的行为完全一致,不具备真正意义上的闭包特性。
由于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机制的行为完全一致,不具备真正意义上的闭包特性。
相关文章推荐
- 测试Apple LLVM中所引入的Blocks机制是否具有闭包特性
- PHP V5.3 中的新特性,第 2 部分: 闭包及 lambda 函数
- 检查gcc编译器是否C++ 11特性
- 结合C++11新特性来学习C++中lambda表达式的用法
- jdk8新特性:Lambda表达式(也称为闭包、可传递的匿名函数)与函数式接口@FunctionalInterface
- Lambda expression in C++ & Haskell || C++ 中的匿名函数 [EN/CN]
- Lambda函数&闭包将成为C++标准新特性
- Lambda函数&amp;闭包将成为C++标准新特性
- c++特性:Lambda表达式
- C++ 0x新特性:详细讲解lambda表达式
- 测试自己对C++是否熟悉
- C++闭包: Lambda Functions in C++11
- c++ 11学习笔记--Lambda 表达式(对比测试Lambda ,bind,Function Object)
- 测试编译器是否支持C++11新特性(1)
- C++闭包: Lambda Functions in C++11
- c++测试两个vector是否相等
- 【总结】C++静态成员变量的特性总结及测试用例
- 测试gcc 4.4的c++ 0x的新特性
- C++新特性~摘录lambda
- 【总结】C++静态成员变量的特性总结及测试用例