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#我觉得他最优美 ...
随机推荐
- warning: expression result unuesd 可能原因是函数忘了加括号,
- POJ 1753 Flip Game DFS枚举
看题传送门:http://poj.org/problem?id=1753 DFS枚举的应用. 基本上是参考大神的.... 学习学习.. #include<cstdio> #include& ...
- 3、Unicode\UTF-8\GBK 区别和联系
字符编码:Unicode和UTF-8之间的关系 可以参考下面blog:https://blog.csdn.net/xiaolei1021/article/details/52093706/ 这篇文章写 ...
- 判断是iphone或是ipad 和 系统版本
//判断是iphone或是ipad等 NSLog(@"Device -- %@",[UIDevice currentDevice].model); //系统版本 NSLog(@&q ...
- thinkphp5项目--企业单车网站(八)(文章板块要点)(删除图片)
thinkphp5项目--企业单车网站(八)(文章板块要点)(删除图片) 项目地址 fry404006308/BicycleEnterpriseWebsite: Bicycle Enterprise ...
- 【Codeforces Round #185 (Div. 2) D】Cats Transport
[链接] 链接 [题意] 有n座山,m只猫. 每只猫都在其中的一些山上玩. 第i只猫在h[i]山上玩,且会在t[i]时刻出现在山脚下(然后就一直在那里等) 然后有p个人. 它们听从你的安排. 在某个时 ...
- 【TP SRM 703 div2 500】 GCDGraph
Problem Statement You are given four ints: n, k, x, and y. The ints n and k describe a simple undire ...
- [Angular] How to styling ng-content
Let's say you are builing a reuseable component. The style structure like this: div > input If yo ...
- RMAN之一:快速入门 分类: H2_ORACLE 2014-02-17 16:11 689人阅读 评论(0) 收藏
1.数据导出基础 (1)创建datapump导出文件的目录对象并为相应用户授予权限. 出于安全考虑,不允许oracle用户直接在OS上进行文件的操作,而应通过directory对象指定. SQL> ...
- [转载]Ocelot简易教程(一)Ocelot是什么
Ocelot简易教程(一)Ocelot是什么 简单的说Ocelot是一个用.NET Core实现并且开源的API网关技术. 可能你又要问了,什么是API网关技术呢?Ocelot又有什么特别呢?我们又该 ...