C++ Lambda表达式基本用法(言简意赅,非常清楚)
创建一个匿名函数并执行。Objective-C采用的是上尖号^,而C++ 11采用的是配对的方括号[]。实例如下:
1
2
3
4
5
6
7
8
9
|
#include <iostream> using namespace std; int main() { []{ cout << "Hello,Worldn" ; }(); } |
我们也可以方便的将这个创建的匿名函数赋值出来调用:
1
2
3
4
5
6
7
8
9
10
11
|
#include <iostream> using namespace std; int main() { int i = 1024; auto func = []( int i) { // (int i) 是指传入改匿名函数的参数 cout << i; }; func(i); } |
捕获选项
- [] Capture nothing (or, a scorched earth strategy?)
- [&] Capture any referenced variable by reference
- [=] Capture any referenced variable by making a copy
- [=, &foo] Capture any referenced variable by making a copy, but capture variable foo by reference
- [bar] Capture bar by making a copy; don’t copy anything else
- [this] Capture the this pointer of the enclosing class
[] 不捕获任何变量
1
2
3
4
5
6
7
8
9
|
#include <iostream> using namespace std; int main() { int i = 1024; auto func = [] { cout << i; }; func(); } |
vs 报错
error C3493: 无法隐式捕获“i”,因为尚未指定默认捕获模式
error C2064: 项不会计算为接受 0 个参数的函数
g++ 报错:
error: ‘i’ is not captured
要直接沿用外部的变量需要在 [] 中指名捕获。
[=] 拷贝捕获
1
2
3
4
5
6
7
8
9
10
11
|
#include <iostream> using namespace std; int main() { int i = 1024; auto func = [=]{ // [=] 表明将外部的所有变量拷贝一份到该函数内部 cout << i; }; func(); } |
结果:
1024
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
#include <iostream> using namespace std; int main() { int i = 1024; auto fun1 = [=]{ // fun1 内存在 i cout << i; // 1024 auto fun2 = []{ // 未指名捕获, i 不存在 cout << i; }; fun2(); }; fun1(); } |
[&] 引用捕获
1
2
3
4
5
6
7
8
9
10
11
12
|
#include <iostream> using namespace std; int main() { int i = 1024; cout << &i << endl; auto fun1 = [&]{ cout << &i << endl; }; fun1(); } |
结果:
0x28ff0c
0x28ff0c
[=, &] 拷贝与引用混合
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
#include <iostream> using namespace std; int main() { int i = 1024, j = 2048; cout << "i:" << &i << endl; cout << "j:" << &j << endl; auto fun1 = [=, &i]{ // 默认拷贝外部所有变量,但引用变量 i cout << "i:" << &i << endl; cout << "j:" << &j << endl; }; fun1(); } |
1
|
|
结果
outside i:0x28ff0c
outside j:0x28ff08
inside i:0x28ff0c
inside j:0x28ff04
[bar] 指定引用或拷贝
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
#include <iostream> using namespace std; int main() { int i = 1024, j = 2048; cout << "outside i value:" << i << " addr:" << &i << endl; auto fun1 = [i]{ cout << "inside i value:" << i << " addr:" << &i << endl; // cout << j << endl; // j 未捕获 }; fun1(); } |
结果:
outside i value:1024 addr:0x28ff08
inside i value:1024 addr:0x28ff04
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
#include <iostream> using namespace std; int main() { int i = 1024, j = 2048; cout << "outside i value:" << i << " addr:" << &i << endl; auto fun1 = [&i]{ cout << "inside i value:" << i << " addr:" << &i << endl; // cout << j << endl; // j 未捕获 }; fun1(); } |
结果:
outside i value:1024 addr:0x28ff08
inside i value:1024 addr:0x28ff08
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
#include <iostream> using namespace std; int main() { int i = 1024, j = 2048, k; cout << "outside i:" << &i << endl; cout << "outside j:" << &j << endl; auto fun1 = [i, &j]{ cout << "inside i:" << &i << endl; cout << "inside j:" << &j << endl; // cout << k; // k 未捕获 }; fun1(); } |
结果:
outside i:0x28ff0c
outside j:0x28ff08
inside i:0x28ff00
inside j:0x28ff08
[this] 捕获 this 指针
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
#include <iostream> using namespace std; class test { public : void hello() { cout << "test hello!n" ; }; void lambda() { auto fun = [ this ]{ // 捕获了 this 指针 this ->hello(); // 这里 this 调用的就是 class test 的对象了 }; fun(); } }; int main() { test t; t.lambda(); } |
C++ Lambda表达式基本用法(言简意赅,非常清楚)的更多相关文章
- python lambda表达式简单用法【转】
python lambda表达式简单用法 1.lambda是什么? 看个例子: g = lambda x:x+1 看一下执行的结果: g(1) >>>2 g(2) >>& ...
- C++11 中function和bind以及lambda 表达式的用法
关于std::function 的用法: 其实就可以理解成函数指针 1. 保存自由函数 void printA(int a) { cout<<a<<endl; } std:: ...
- Lambda 表达式递归用法实例
注意: 使用Lambda表达式会增加额外开销,但却有时候又蛮方便的. Windows下查找子孙窗口实例: HWND FindDescendantWindows(HWND hWndParent, LPC ...
- python lambda表达式简单用法
习条件运算时,对于简单的 if else 语句,可以使用三元运算来表示,即: 1 2 3 4 5 6 7 8 # 普通条件语句 if 1 == 1: name = 'wupeiqi' else ...
- 快速掌握Java中Lambda表达式的用法
Lambda表达式的作用: Lambda表达式的作用就是简化代码开发,让代码看起来更加简介.它是用来简化匿名内部类的.但是并不是所有的匿名内部类都能用Lambda表达式简化,Lambda表达式是有使用 ...
- Lambda表达式的用法
参考:https://www.cnblogs.com/knowledgesea/p/3163725.html
- c++中lambda表达式的用法
#include <iostream> using namespace std; int main(){ ; auto func1 = [=](;}; auto func2 = [& ...
- java8+ Lambda表达式基本用法
LIST public class LambdaTest { @Getter @Setter @AllArgsConstructor static class Student{ private Lon ...
- C# LINQ查询表达式用法对应Lambda表达式
C#编程语言非常优美,我个人还是非常赞同的.特别是在学习一段时间C#后发现确实在它的语法和美观度来说确实要比其它编程语言强一些(也可能是由于VS编译器的加持)用起来非常舒服,而且对于C#我觉得他最优美 ...
随机推荐
- 火狐与IE的7个JavaScript差异
作者注:本篇文章发表于2009.04.27,是一篇关于讨论Javascript在IE6.IE7和FF2+.FF3.0之间的存在的问题的文章. 虽然须要用冗长的JavaScript代码去识别特定的浏览器 ...
- 使用四种框架分别实现百万websocket常连接的服务器--转
原文地址:http://colobu.com/2015/05/22/implement-C1000K-servers-by-spray-netty-undertow-and-node-js/#Nett ...
- python打印即时输出的方法
>>> import sys>>> sys.stdout.flush() 但是实验了,上面的报错,应该是不对的. 实验了,下面的报错,应该是不对的. 使用 prin ...
- MFC注册窗口类以及FindWindow按窗口类名查询(避免用#32770获取窗口句柄)
呵呵,最近在研究SendMessage函数,其中需要用到m_hWnd,之后延伸着又尝试获得窗口的句柄,于是遇到了FindWindow函数,原型如下: HWND FindWindow ( LPCSTR ...
- Eclipse查看某个方法被哪些类调用
方法一:打开该类,在类的定义上即类名上,右键-->References--->Project ,就可以查看该类是否被工程中的其他Java文件引用过:但是如果在JSP页面,这个方法查不出来 ...
- angular模块详解
原文: https://www.jianshu.com/p/819421ff955a 大纲 1.angular应用是模块化的 2.对模块(Module)的认识 3.模块的分类:根模块和特性模块 4.N ...
- (十二)RabbitMQ消息队列-性能测试
原文:(十二)RabbitMQ消息队列-性能测试 硬件配置 宿主机用的联想3850X6的服务器四颗E7-4850v3的处理器,DDR4内存,两块1.25TB的pcie固态.在宿主机上使用的事esxi5 ...
- iOS开发之Quartz2D 五:UIKIT 绘图演练,画文字,画图片
#import "DrawView.h" @implementation DrawView -(void)awakeFromNib { // //画图片 // UIImage *i ...
- 【C#】万事开头难(二)<机房重构>
前言 机房将要进行完了,之所以仍然使用这个题目,是由于我想告诉自己.无论面对多么未知的事物.不要害怕,去做就好.在这么多天的机房重构中,发现了好多问题,也攻克了好多问题,今天,就把我解决的问题分享给大 ...
- Android Studio Gradle:Resolvedependencies':app:_debugCompile' 问题解决纪录
问题描述: 第一次使用AndroidStudio打开已经存在的AndroidStudio项目,卡在Gradle:Resolvedependencies':app_debugCompile'步骤,即使进 ...