C++11新特性:Lambda函数(匿名函数) 一段代码即可理解

原创 2016年08月29日 10:03:01

C++11新特性:Lambda函数(匿名函数) 一段代码即可理解



基本lambda语法
基本形式如下:
[capture](parameters)->return-type {body}

[]叫做捕获说明符,表示一个lambda表达式的开始。接下来是参数列表,即这个匿名的lambda函数的参数,->return-type表示返回类型,如果没有返回类型,则可以省略这部分。返回类型的表示法,这涉及到c++11的另一特性:自动类型推导,最后就是函数体部分了。匿名函数与普通函数在结构上都是一样,即有传入值,有函数体,唯一就缺函数名而已。

我们可以这样输出"hello,world"

// 定义一个匿名函数,然后用指针指向此函数

auto func = [] () { cout << "hello,world"; };
// 调用函数

func();


关于[] 捕获说明符:

(其实就是如何调用匿名函数所在的函数中的变量)

  • [] 不截取任何变量

  • [&} 截取外部作用域中所有变量,并作为引用在函数体中使用

  • [=] 截取外部作用域中所有变量,并拷贝一份在函数体中使用

  • [=, &param]   截取外部作用域中所有变量,并拷贝一份在函数体中使用,但是对param变量使用引用

  • [param]   截取param变量并且拷贝一份在函数体重使用,同时不截取其他变量

  • [this]            截取当前类中的this指针。如果已经使用了&或者=就默认添加此选项。



运行下述代码,即可速度掌握Lambda函数


// C++11新特性:Lambda函数(匿名函数)

#include <iostream>  

#include <typeinfo>  

using namespace std;

 

int main(void)

{

// 将创建的匿名函数赋值给sum  

auto sum = [](int x, int y) -> int {return x + y; };

 

// typeid用于返回指针或引用所指对象的实际类型,typeid是操作符,不是函数

// 输出:class <lambda_c2f1f973a39f2b265512c>

std::cout << typeid(sum).name() << std::endl;

 

int x = 10, y = 20;

auto result = sum(x, y);

 

// 输出: result:30

std::cout << "result : " << result << std::endl;

 

// 只是声明了一个lambda函数,但未调用  

[] {

std::cout << "Done1" << std::endl;

};

 

// 声明并调用一个lambda函数  

// 输出: Done2

[] {

std::cout << "Done2" << std::endl;

}();

 

int a = 1, b = 10;

//    无法通过编译  

//    [] {  

//        return a + b; // 错误:‘a’未被捕获      错误:‘b’未被捕获  

//    };  

 

// [=] 通过捕捉,获得上下文的数据,所以可以使用变量a,b,但无法修改a,b  

[=] {

return a + b;

};

 

// 输出:b = 10

std::cout << "b = " << b << std::endl;

 

// [&] 捕捉上下文,并且可以修改a,b  

[&](int c) {

b = a + c;

}(50);

 

// 输出:b = 51

std::cout << "b = " << b << std::endl;

 

//    [&a, b] (int c) {   // a可以在函数体中被修改,而b不能  

//        b = a + c;  

//    }(1000);  

 

auto b2 = [a, &b](int c) -> int { // a只读, b读写  

b = a + c;

return a + c;

}(1000);

 

// 输出: b1 = 1001 b2 = 1001

std::cout << "b = " << b << "  b2 = " << b2 << std::endl;

 

int n = getchar();

return 0;

}

 

运行结果

 




版权声明:更多文件,请访问 qzher.com 致力于良心IT培训,深圳QQ群:326023167

C++11新特性中的匿名函数Lambda表达式的汇编实现分析

Lambda表达式中较复杂的形式如下: [ capture ] ( params ) -> ret { body } 现在我们构造一个简单的Lambda闭包函数进行分析: i...

C++11新特性中的匿名函数Lambda表达式的汇编实现分析

文章开头提到以下代码 1 Integer a = new Integer(2); 2 Integer b = new I...

C++11新特性:Lambda函数(匿名函数)

C++11新特性:Lambda函数(匿名函数) 分类: C++开发2012-09-02 15:39 12365人阅读 评论(24) 收藏 举报 lambdac++string编译器...

C++11新特性:Lambda函数(匿名函数)

声明:本文参考了Alex Allain的文章http://www.cprogramming.com/c++11/c++11-lambda-closures.html 加入了自己的理解,不是简单的...

C++11新特性:Lambda函数(匿名函数)

声明:本文参考了Alex Allain的文章http://www.cprogramming.com/c++11/c++11-lambda-closures.html 加入了自己的理解,不是简单的翻译...

C++11新特性:Lambda函数(匿名函数)

 声明:本文参考了Alex Allain的文章http://www.cprogramming.com/c++11/c++11-lambda-closures.html 加入了自己的理解,不是简...

C++11新特性:Lambda函数(匿名函数)

http://www.fast818.com/n308.ashx 声明:本文参考了Alex Allain的文章http://www.cprogramming.com/c++11/c++11-...
  • wywty
  • wywty
  • 2013年11月06日 09:51
  • 587

C++11新特性:Lambda函数(匿名函数)

声明:本文参考了Alex Allain的文章http://www.cprogramming.com/c++11/c++11-lambda-closures.html 加入了自己的理解,不是简单的翻译...

C++11新特性:Lambda函数(匿名函数)

C++11终于知道要在语言中加入匿名函数了。匿名函数在很多时候可以为编码提供便利,这在下文会提到。很多语言中的匿名函数,如C++,都是用Lambda表达式实现的。Lambda表达式又称为lambda函...

C++11中的匿名函数指针(Lambda表达式)

转载自:http://blog.csdn.net/richerg85/article/details/51457712 这篇文章是根据维基百科整理来的,原文请看:http://en.wikipe...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++11新特性:Lambda函数(匿名函数) 一段代码即可理解
举报原因:
原因补充:

(最多只允许输入30个字)