测试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机制的行为完全一致,不具备真正意义上的闭包特性。 

你可能感兴趣的:(express)