C++的匿名函数及引用

匿名函数表达式形如

[capture](parameters)->return-type{body}

capture:它定义了Lambda表达式体内部可以访问哪些外部作用域中的变量,以及这些变量是如何被捕获的。(比如值传递或者引用传递)

parameters:参数列表和普通函数的参数列表相同

return-type:返回值类型,若无返回值,可以不写

body:函数体

匿名函数可以将它们赋给变量和作为参数传递,还可以像函数一样对其求值。

//赋值给变量,分别采用值传递和引用传递
//捕获时有一点需要注意,在赋值后,x(捕获)的值发生改变,不会改变匿名函数执行
int x = 10;  
auto lambdaByValue = [x]() { std::cout << "x by value: " << x << std::endl; };  
auto lambdaByRef = [&x]() { x = 20; std::cout << "x by reference: " << x << std::endl; };  
//直接求值,接上述,可得输出数值,20,10
lambdaByRef();
lambdaByValue();

//作为参数传递用法
std::for_each(nums.begin(), nums.end(), [](int n) {std::cout << n << ' ';});  

上文提到了引用,这里对其进行说明

C++ 支持把引用作为参数传给函数,这比传一般的参数更安全。当作为值传递时,我们相当于拷贝了一份参数,但使用引用传递,相当于拿源数据进行操作。比如上述代码中的值引用会将x的值变为20。

一般来说,使用下述方式创建引用,上述方式&x有点像取地址,所以给出了捕获指针的对比代码供参考

//创建引用
int i = 17;
int&  r = i;
//1指针
int x = 10;
int* y = &x;
auto lambdaByValue = [x]() { std::cout << "x by value: " << x << std::endl; };
auto lambdaByRef = [y]() { *y = 20; std::cout << "x by reference: " << *y << std::endl; };


//2引用
int x = 10;
auto lambdaByValue = [x]() { std::cout << "x by value: " << x << std::endl; };
auto lambdaByRef = [&x]() { x = 20; std::cout << "x by reference: " << x << std::endl; };

引用也可以作为返回值,和正常返回值使用方法相同。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值