首页 > 编程语言 >C++ 之lambda表达式

C++ 之lambda表达式

时间:2022-09-01 18:44:09浏览次数:71  
标签:变量 作用域 捕获 C++ lambda 表达式 按值

C++ 之lambda表达式

[capture](parameters) option -> return-type { body }

capture:捕获列表,可选
捕捉列表总是出现在 lambda 表达式的开始。实际上,是 lambda 引出符,编译器根据该引出符判断接下来的代码是否是 lambda 表达式。
捕捉列表能够捕获上下文中的变量,以在 lambda 表达式内使用,主要有如下几种情况:

# 不捕获任何变量
[]

# 按引用捕获外部作用域中所有变量,在 lambda 表达式内使用
[&]

# 按值捕获外部作用域中所有变量,在 lambda 表达式内使用
# 按值捕获的变量,在 lambda 表达式内是只读的,不能修改赋值
[=]

# 捕获外部作用域中所有变量,其中foo变量按引用捕获,其他的按值捕获
[=, &foo]

# 按值捕获bar变量,同时不捕获其他变量
[bar]

# 捕获当前类中的 this 指针
# 捕获了 this 就可以在 lambda 中使用当前类的成员变量和成员函数。
# 如果已经使用了 & 或者 =,就默认添加此选项。
[this]

parameters:参数列表,可选
option:函数选项,可选
return-type:返回值类型,可选。没有返回值的时候也可以连同符号一起省略
body:函数体

// 匿名函数的定义
	[]() {
		cout << "匿名函数" << endl;
	};

	// 匿名函数的调用
	[]() {
		cout << "匿名函数的调用" << endl;
	}();

	int a = 10;
	//[]() {  // 不捕获任何变量
	//	cout << a;
	//}(); 

	// 按引用捕获
	[&]() {
		cout << a++ << endl;
	}();
	cout << a << endl;

	// 按值捕获(只读, 不能修改)
	//[=]() {
	//	cout << a++ << endl; //报错
	//}();
	//cout << a << endl;

	// 按值捕获 (可修改,但属于按值传递, 不影响外部变量的值)
	[=]() mutable {
		cout << a++<<endl;    // 10
	}();
	cout << a << endl;;

	// 有参的匿名函数
	[](int x, int y) {
		cout << x << "+" << y << "=" << x + y << endl;
	}(1,2);


	// 匿名函数的返回值
	// 返回值可以省略  编译器会自动推断返回值的类型
	int sum = [](int x, int y) -> int{
		return x + y;
	}(1,2);
	cout << sum << endl;

	int sum1 = [](int x, int y)  {
		return x + y;
	}(3, 2);
	cout << sum1 << endl;

标签:变量,作用域,捕获,C++,lambda,表达式,按值
From: https://www.cnblogs.com/lofly/p/16647514.html

相关文章

  • C++之常用的算法
    C++之常用的算法1函数对象重载函数调用运算符的类,其对象称为函数对象。一元仿函数/二元仿函数(根据参数个数判定)classMyPrint{public: voidoperator()(intn......
  • UE4 C++学习 浅析UProperty属性说明符
    本文就UProperty是什么?以及UProperty怎么用?做一个简单的总结。什么是UPROPERTY?首先看下官方的解释:  感觉还是比较模糊没看懂有什么用,我们接着往下看 要知道UPR......
  • C++ delete进行了什么操作
    #include<iostream>classA{public:voidt(){std::cout<<"helloworld!"<<std::endl;}~A(){std::co......
  • 如何理解CV_8UC3等表达式
    出处:http://www.cnblogs.com/suubai/OpenCV在对Mat对象进行初始化时,经常需要对矩阵的类型进行定义,这就需要用到类似于CV_8UC3的表达。该宏定义的通式为: 1、bit_depth:......
  • 【C++】Debugging Segmentation Faults
     背景linux下的程序,在遇到空指针解引用、栈错误等原因崩溃时,bash会输出一条:Segmentationfault(coredump)如果你看到coredumped字样,并且在目录下也找到了一个叫co......
  • 在 C# CLR 中学习 C++ 之了解 namespace
    一:背景相信大家在分析dump时,经常会看到WKS和SRV这样的字眼,如下代码所示:00007ffa`778a07b8coreclr!WKS::gc_heap::segment_standby_list=0x00000000`000000000......
  • Rust 从入门到精通06-语句和表达式
    1、语句和表达式语句和表达式是Rust语言实现逻辑控制的基本单元。在Rust程序里面,语句(Statement)是执行一些操作但不返回的指令,表达式(Expressions)计算并产生一个值。表......
  • # C++ 简单的程序段记时工具
    基于宏定义的几个C++记时工具,实现类似于MATLAB中tic().toc()的功能代码#include<ctime>#definedef_tic(name)clock_tt_##name#definerec_tic(name)t_##name=c......
  • c++的类型转换
    1.int转string,函数to_string()x=10;stringm=to_string(x);经测试gccv5.4.0版本不支持,版本v7.5.0支持。判断版本号命令:g++-v同样适用于double,float2.string转int,......
  • C++ 地形导航系统之确定峰点的位置
    #include<iostream>#include<string>#include<fstream>#defineN64boolisPeak(intgrid[][N],intr,intc);intmain(){intnrows,ncols;intm......