C++ 11 匿名函数Lambda表达式
来源:互联网 发布:淘宝商城怎么开 编辑:程序博客网 时间:2024/06/06 01:55
C++ 11匿名函数Lambda表达式
格式
语法
[ capture-list ] ( params ) mutable exceptionattribute -> ret { body }
[ capture-list ] ( params ) -> ret {body }
[ capture-list ] ( params ) { body }
[ capture-list ] { body }
参数说明
mutable 允许body修改按复制捕获的参数,及调用其非const成员函数
exception为闭包类型的operator()提供异常规定或noexcept子句
attribute 为闭包类型的operator()提供属性规定
capture-list捕获参数列表
[a, &b] 其中a以const值捕获而b以引用捕获。
[this] 以值捕获this指针
[&] 以引用捕获所有使用的自动变量,及以引用捕获当前对象,若它存在
[=] 以值捕获所有使用的自动变量,及以引用捕获当前对象,若它存在
[] 无捕获
params 参数列表,参数类型可以用auto代表泛型
ret 返回类型。若不写,则为函数的return语句所隐喻(或若函数不返回任何值则为void)
body 函数体
例:
autof = [](autoa,autob){cout<<a<<" "<<b<<endl; };
f(3, 4.5);
f(5.5,"abc");
intn= 10,m = 20;
autof2 = [n, &m](){
//n++;//语法错误,n为const类型不可改变
cout<<n<<" "<<m<<endl;;
++m;
};
f2();
cout<<n<<" "<<m<<" "<<endl;
说明,防止崩溃
Lambda表达式本身是一个对象,重载了()运算符,operator()。
以值捕获的参数对像内会有一个副本,是const类型,如果需要改变这个值需要参数列表后加上mutable关键字。
以引用捕获的参数,对象内会存储一个指针,类型为T *const p,指针指向捕获前的参数,所以引用方式捕获的参数,Lambda内可以改变捕获参数的值。
当通过引用捕获参数时,要确保Lambda表达式执行时,参数内存没有被释放,否容易导致崩溃。特别是以引用的方式捕获栈上的参数,结束完赋值后很有可能已经离开了栈空间。
例:
struct MyStruct
{
function<void(void)>f;
};
void f(MyStruct*pStruct)
{
inta= 10;
pStruct->f=[&a]() {//错误,当 f执行完后a的内存被释放了,容易崩溃
a=a*a;
};
}
Lambda表达式本身也是一个对象,在执行Lambda表达式时要防止lambda表达式对象自己被释放,lambda表达式对象释放后,捕获的参数也被释放了。
struct B
{
function<void(void)>f;
};
B*f2()
{
B*b=newB;
inta= 10;
b->f=[b,&a]() {
deleteb;//错误,b对象释放会将仿函数对象一起释放调。
a= 11;//程序崩坏Lambda表达式已经被释放掉了,存储a的地址参数被释放了。
};
returnb;
}
- 【C#】之匿名函数及Lambda表达式
- C/C++匿名函数(Lambda)表达式
- C#lambda表达式和匿名函数
- 匿名函数 & Lambda 表达式
- 匿名函数 - lambda表达式
- 匿名函数 lambda表达式
- c++11lambda表达式,匿名函数
- C++ 11 匿名函数Lambda表达式
- C++11中的匿名函数(lambda函数,lambda表达式)
- C++11中的匿名函数(lambda函数,lambda表达式)
- C++11中的匿名函数(lambda函数,lambda表达式)
- C++11中的匿名函数(lambda函数,lambda表达式)
- C++11中的匿名函数(lambda函数,lambda表达式)
- C++11中的匿名函数(lambda函数,lambda表达式)
- C++11中的匿名函数(lambda函数,lambda表达式)
- C++11中的匿名函数(lambda函数,lambda表达式)
- C++11中的匿名函数指针(lambda函数,lambda表达式)
- C++11中的匿名函数(lambda函数,lambda表达式)
- 题目1096:日期差值
- 1445: Pku3245 Sequence Partitioning
- 《Python核心编程》(第二版) 第3章 Python基础
- 数据库管理员用户角色组权限设计
- 一个循环实现新数组n位值是老数组前n位的和
- C++ 11 匿名函数Lambda表达式
- fail-fast(快速失败/报错机制)-ConcurrentModificationException
- Ubuntu14.04 下载&&编译 Android 5.1.1源码(采用国内清华大学镜像)
- 设计模式学习--桥接模式
- Faster-RCNN+ZF用自己的数据集训练模型(Python版本)
- C++ new一个数组时,指针移动程序崩溃问题
- 将tomcat源码导入进eclipse
- web 学习笔记2-CSS
- Axure常用快捷键及几种原型工具