C++ lamba使用
Moderm Effective C++ 条款31 第206提到了按引用捕获局部变量和函数形参时,如果lambda式的生命期依赖于局部变量和函数形参的生命期,需注意空悬引用的问题。
原书的例子不够直观,把它改写后进行说明。
#include "pch.h"
#include <iostream>
#include <vector>
#include <functional> using FilterContainer = std::vector<std::function<bool(int)>>;
FilterContainer filter; void addDivisorFilter() { auto divisor = ;
filter.emplace_back([&](int value) {
return value % divisor == ;
});
std::cout << divisor << std::endl;
} int main()
{
addDivisorFilter();
addDivisorFilter();
std::cout << &filter[] << std::endl;
std::cout << filter[]() < <std::endl; //Unexpected function calls
std::cout << &filter[] << std::endl;
std::cout << filter[]() << std::endl; //Unexpected function calls
}
filter是一个筛选器函数(筛选5的倍数)集合,line23,预期输出0,因为4不是5的倍数。line23,预期输出1.
实际结果则是
箭头1指向的结果看起来正确,箭头2指向的结果不正确,但这两个结果其实都是未定义行为的结果,不符合预期。
跟踪代码如下:
红框部分显示divisor是个很大的负数,不是预期的数字5。所以两次lambda调用结果输出都是0。
问题就出在lambda引用了divisor这个局部变量,addDivisorFilter函数出了代码块后,divisor消亡,lambda指向了一个空悬的divisor引用,当调用lambda时,它里面的divisor是一个未知值。
用这个未知值来进行模计算,当然会出错了。
未完待续...
C++ lamba使用的更多相关文章
- 【lamba】java 8的新特性
看到lamba表达式用起来还不错,找了几篇文章学习下: 所以结合之前两个反编译的结果可以看到,lamdba表达式运行整体思路大致如下: 1. lamdba表达式被编译生成当前类的一个私有静态方法 2. ...
- lamba匿名函数与内置函数/递归
max 循环出的参数给func,func的返回值给key,然后比较那个返回值max(salary,key=func) 匿名函数:max(salary,key=lamba x:salaries[x]) ...
- lamba数据架构以及数据湖
面试大数据项目,面试过程中发现面试官提到的两个概念没有搞清楚: 1. lamba数据架构:这个概念的提出是由storm的作者提出来的,其实主旨就是想要说明,数据的处理分成三层,一类是批处理程序(bat ...
- Java8中list.sort的lamba表达式
最近写代码,需要对list集合排序,IDEA总是黄色警告: Reports calls to Collections.sort(list, comparator) which could be rep ...
- python高阶函数(Map、Reduce、Filter、lamba)
Map函数 map()函数接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回. 代码如下: >>> def f(x): . ...
- 【c++】c++ 11之lamba表达式
C++ lambda表达式与函数对象 lambda表达式是C++11中引入的一项新技术,利用lambda表达式可以编写内嵌的匿名函数,用以替换独立函数或者函数对象,并且使代码更可读.但是从本质上来讲, ...
- [C/C++11语法]_[0基础]_[lamba 表达式介绍]
场景 lambda 表达式在非常多语言里都有一席之地,由于它的原因,能够在函数里高速定义一个便携的函数,或者在函数參数里直接高速构造和传递. 它能够说是匿名函数对象,一般仅仅适用于某个函数内,仅仅做暂 ...
- linq 和lamba表达式
一.什么是Linq(what)二.Linq的优点(why)三.Linq查询的步骤(how)四.查询基本操作五.結合實例代碼(具體聯繫用linqtosql來寫的增刪改查)一.什么是Linq(what). ...
- python lamba表达式
lambda函数也叫匿名函数,即,函数没有具体的名称. g=lambda x:x**2 def f(x): return x**2 lambda语句中,冒号前是参数,可以有多个,用逗号隔开,冒号右边是 ...
随机推荐
- 推特算法,分布式ID
package casclient_demo1.util; import java.lang.management.ManagementFactory; import java.net.InetAdd ...
- python3 不知文件编码情况下打开文件代码记录
import chardet path='test.txt' bytes = min(100, os.path.getsize(path)) raw = open(path, 'rb').read(b ...
- fastJson注解@JSONField使用的一个实例
1.实体类 package jsonArrayjsonObject.cn; import java.io.Serializable; import java.util.Date; import com ...
- Controller层aop
利用@Around通知修改Controller的返回值 自定义一个注解@OperationBtn 在切入点Controller上加上自定义注解 接下来就是重点了,AspectJ写切面类,对该Contr ...
- springmvc controller方法返回值
- <转>ajax 同步异步问题
原文:https://blog.csdn.net/wxr15732623310/article/details/76387787 看似简单明白的问题说起来却迷迷糊糊,完全没有逻辑,说不到重点上,再来整 ...
- JPA和SpringData知识梳理
一. JPA,全称Java Persistence API,用于对象持久化的API,定义一套接口,来规范众多的ORM框架,所以它是在ORM框架之上的应用. 下面主要讲JPA在Hibernate基础上的 ...
- java文件转发
实际开发情景中,有时会遇到文件需要从一台服务器发到另一台服务器的情况,比如外网发到内网,服务器之间文件同步的情况. 就可以用文件转发. 转发端代码: /** * * @param fileName 保 ...
- mysql授权远程访问
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'IDENTIFIED BY '123456' WITH GRANT OPTION; Query O ...
- Codeforces Round #449 (Div. 2)
Codeforces Round #449 (Div. 2) https://codeforces.com/contest/897 A #include<bits/stdc++.h> us ...