c++11 lambda表达式

本文深入探讨C++中Lambda表达式的语法结构与工作原理,包括捕获列表、参数列表、返回类型及函数体的使用,同时解析了值捕获与引用捕获的区别,以及如何在实际编程中灵活运用Lambda表达式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

lambda形式:
  [capture list](param list)->return_type { body }
  
  capture list: 捕获列表,只能是当前lambda表达式所在函数体的局部变量名,直接在body块使用。
  param list  : 函数参数,传参
  return_type : 函数返回值类型,如果body只有一句return语句编译器可以自动推导值类型,否则必须显示指定类型。
  body		  : 函数实现体,内部可以直接使用非lambda所在函数体的全局变量 和 lambda所在函数体的static变量
 
 *我们书写的lambda表达式,编译器在编译阶段会自动帮我们转化为一个类,这个类不提供默认构造、
默认Operator=()、默认析构,有可能会提供默认移动copy构造或者默认copy构造。

lambda表达式从编译器的角度就是函数对象.

关于[捕获的说明]

值捕获:
	将捕获参数值copy到lambda表达式中
引用捕获:
	捕获参数按引用的方式传入lambda,在表达式中的修改会影响到外部值。
显示捕获:
	把表达式要用到的函数体中的局部变量都列举出来。
隐式捕获:
	[=[,]...] body语句块中按值传入的参数没有在捕获列表中显示声明,...部分必须是按引用传入
	[&[,]...] body语句块中按引用传入的参数没有在捕获列表中显示声明,...部分必须按值传入

实例:

// 完成一个数值比较的表达式:
  [](const int a, const int b){ return (a > b ? a : b);} // 自动推导返回值int
  //编译器处理后:
  class compare_12 // 没有确定的命名规则
  {
  publi:
	int operator()(const int a, const int b) // 如果需要对a或者b修改,这里就不是const
	{
		return (a > b ? a : b);
	}
  };

lambda对象:
    audo fn=[](const int a, const int b){ return (a > b ? a : b);};
   调用:
     fn();

扩展一:

int g_rest; // 全局变量
int compareValue( int a,  int b)
{
	auto ret = [=] {return g_rest = (a > b ? a : b); };		//  两个都是按值传入
	return ret();
}
// 编译器优化
class compared_11
{
public:
	// 如果需要对a或者b修改,这里就不是const
	compared_12(const int a, const int b) :m_a(a), m_b(b) {} 
	int operator()()
	{
		return m_a > m_b ? m_a : m_b;
	}
private:
	int m_a;
	int m_b;
};

扩展二:

int g_rest; // 全局变量
int compareValue( int a,  int b)
{
	auto ret = [a, b] {return g_rest=(a > b ? a : b); };	//  两个都是按值传入
	return ret();
}
// 编译器优化:
class compared_13
{
public:
	// 如果需要对a或者b修改,这里就不是const
	compared_12(const int a, const int b) :m_a(a), m_b(b) {} 
	int operator()()
	{
		return m_a > m_b ? m_a : m_b;
	}
private:
	int m_a;
	int m_b;
};

扩展三:

int g_rest; // 全局变量
int compareValue( int a,  int b)
{
	auto ret = [&] {return g_rest = (a > b ? a : b); };	//  两个都是按引用传入
	return ret();
}

class compared_14
{
public:
	// 如果需要对a或者b修改,这里就不是const
	compared_12(const int& a, const int& b) :m_a(a), m_b(b) {} 
	int operator()()
	{
		return m_a > m_b ? m_a : m_b;
	}
private:
	const int m_a&;
	const int m_b&;
};

扩展四:

int g_rest; // 全局变量
int compareValue( int a,  int b)
{
	auto ret = [&,b] {return g_rest = (a > b ? a : b); };  //  a是按引用传入,b必须是按值传入 
	return ret();
}
	
//编译优化:

class compared_12
{
public:
	// 如果需要对a或者b修改,这里就不是const
	compared_12(const int& a, const int b) :m_a(a), m_b(b) {} 
	int operator()()
	{
		return m_a > m_b ? m_a : m_b;
	}
private:
	const int m_a&;
	const int m_b;
};

扩展五:

int g_rest; // 全局变量
int compareValue( int a,  int b)
{
	auto ret = [=, &b] {return g_rest = (a > b ? a : b); }; //a是按值传入,b必须是按引用传入
	return ret();
}
	
//编译优化:

class compared_12
{
public:
	// 如果需要对a或者b修改,这里就不是const
	compared_12(const int a, const int& b) :m_a(a), m_b(b) {} 
	int operator()()
	{
		return m_a > m_b ? m_a : m_b;
	}
private:
	const int m_a;
	const int m_b&;
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值