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&;
};