您的位置:首页 > 编程语言 > C语言/C++

测试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标准库作为辅助。

//============================================================================
// 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机制的行为完全一致,不具备真正意义上的闭包特性。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: