IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 《c++11学习笔记》 --- lambda表达式的用法 -> 正文阅读

[C++知识库]《c++11学习笔记》 --- lambda表达式的用法

语法:

?[capture] (params) opt->ret { bady };

capture:捕获列表
params:参数列表
opt:函数选项
ret:返回值类型
bady:函数体

auto f = []{int a} -> int {return a + 1;};
std::cout<<f(1)<<std::endl; //输出:2
	
//c++11中可以省略返回值定义:
auto f = [](int a){return a + 1;};
	
//没有参数时,参数列表可省略,例如:
auto f1 = [](){return 0;};
auto f1 = []{return 0;}; //省略空参数列表

可以通过捕获列表捕获一定范围内的变量:?

[]不捕获任何变量。
[&]捕获外部作用域中所有变量,并作为引用在函数体中使用(按引用捕获)。
[=]捕获外部作用域中所有变量,并作为副本在函数体中使用(按值捕获)。
[=, &foo]按值捕获外部作用域中所有变量,并按引用捕获foo变量。
[bar]按值捕获bar变量,同时不捕获 其他变量。
[this]捕获当前类中的this指针,让表达式拥有和当前类成员函数同样的访问权限,如果已经使用=或者&,就默认添加此选项。

例如:

class A
{
public:
	int i = 0;
		
	void func(int x, int y)
	{
		auto x1 = []{return i;};                   //error,没有捕获外部变量
		auto x2 = [=]{return i + x + y;};          //ok,捕获所有外部变量
		auto x3 = [&]{return i + x + y;};          //ok,捕获所有外部变量
		auto x4 = [this]{return i;};               //ok,捕获this指针
		auto x5 = [this]{return i + x + y;};       //error,没有捕获x,y
		auto x6 = [this, x, y]{return i + x + y;}; //ok,捕获this指针、x、y
		auto x7 = [this]{return i++;};             //ok,捕获this指针,并修改成员值
			
    }
};

int a = 0, int b = 1;
auto f1 = []{return a;};            //error,没有捕获外部变量
auto f2 = [&]{return a++;};         //ok,捕获所有外部变量,并对a执行自加运算
auto f3 = [=]{return a;};           //ok,捕获所有外部变量,并返回a
auto f4 = [=]{return a++;};         //error,a是以复制方式捕获的,无法修改
auto f5 = [a]{return a + b;};       //error,没有捕获变量b
auto f6 = [a, &b]{return a + (b++);}; //ok,捕获a和b的引用,并对b做自加运算
auto f7 = [=, &b]{return a + (b++);}; //ok,捕获所有外部变量和b的引用,并对b做自加运算

	
//再捕获的一瞬间,a的值已经被复制到了f中,之后再修改a的值,此时f中存储的a仍然是之前捕获到的值。
int a = 0;
auto f = [=]{return a;};  //按值捕获外部变量
a += 1;                   //a被修改
std::cout<<f()<<std::endl;  //输出0
	
	
//使用mutable:
int a = 0;
auto f1 = [=]{return a++;}; //error,a是以复制方式捕获的,无法修改
auto f2 = [=]() mutable {return a++;}; //ok, 使用mutable
//注意:在使用mutable修饰的lambda表达式就算没有参数也要写明参数列表。
	
/*
*lambda表达式的operator()默认是const的,
*一个const成员函数是无法修改成员变量的值的,
*mutable的作用在于取消operator()的const
*/
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-12-07 11:51:13  更:2021-12-07 11:52:42 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 10:47:34-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码