关闭

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

标签: Lambda函数
108人阅读 评论(0) 收藏 举报
分类:

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;

}

 

运行结果

 




0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:9338次
    • 积分:264
    • 等级:
    • 排名:千里之外
    • 原创:17篇
    • 转载:2篇
    • 译文:0篇
    • 评论:3条
    文章分类
    文章存档