C++--- Lambda匿名函数表达式_按值传递


格式:

[函数对象参数] (形参) mutable 或 exception 声明 -> 返回值类型 {函数体}

[函数对象参数]:

[]表示表达式的开始,必须有;用来设置如何捕获匿名函数外的变量

[ ]里为空

  [ ]里为空,表示任何变量都不会传递给lambda表达式,没有参数

int a = 10;
int b = 20;
int c;
int x = []()->int {return 100; }();//不能捕获匿名函数外的所有变量


std::cout << "x=" << x << std::endl;

return 0;

[=]

[=]  表示默认按值传递,编译器自动为我们按值传递了所有局部变量

按值传递:语句体内修改变量值,不会影响外面的变量值

注意:捕获的变量将不会被作为垃圾回收,直至引用变量的委托超出范围为止

int a = 10;

int b = 20;

int c = 30;

int x = [=]()->int {int a = 100; return b + c; }();//按传值方式可以捕获所有外部变量

std::cout << "x=" << x << std::endl;

std::cout << "a=" << a << std::endl;

 C++--- Lambda匿名函数表达式_按值传递_02

[&]

[&]  表示默认按引用传递

引用传递,由于两个变量指向同一个数据,所以语句体内修改变量值,会影响外面的变量值

#include <iostream>


int main() {

int a = 10;
int b = 20;
int c=30;
int x = [&]()->int {a++;std::cout << "内部a=" << a << std::endl; return b + c; }();//按引用方式可以捕获所有外部变量

std::cout << "x=" << x << std::endl;
std::cout << "外部a=" << a << std::endl;

return 0;

}


 [变量名]

[var]:var是变量名,只传递变量var,其它不能传;前面可以添加&前缀,表示var变量按引用传递

[x, &y]    //x 按值捕获, y 按引用捕获

int a = 10;
int b = 20;
int c;
int x = [a, b]()->int {return a + b; }();//只能捕获a和b变量,不能捕获c变量


std::cout << "x=" << x << std::endl;


  [ =,&var] :引用捕获变量var,其他外部变量使用值捕获

  [ &,var]:值捕获变量var,其他外部变量使用引用捕获


[this] 

this:函数体内可以使用 Lambda 所在类中的所有成员变量和成员函数

#include <iostream>

class A {
public:
A(int a=0):m_i(a){}
void print() {

x= [this]()->int { return this->m_i+100; }(); //用this指针使用类成员
std::cout << "x=" << x << std::endl;
}

private:
int m_i;
int x;

};

int main() {

A d(11);
d.print();

return 0;

}


 (形参)

    参数列表--lambda表达式自己的参数列表

没有参数可以省略

可以按值传递,如 (a,b);也可以按引用传递,如 (&a,&b)

#include <iostream>

auto lambda = [](int value) { std::cout << "value: " << value << std::endl; }; //定义一个匿名函数
//注意:最后面没有(),所以没有执行

int main() {

lambda(56); //执行匿名函数

return 0;

}


mutable 选项(可选)--按值传递时使用

  加上mutable后,在语句体内可以修改变量值;省略变量只能只读,但不会修改函数体外的值

#include <iostream>


int main() {

int a = 10;
int b = 20;
int c=30;
int x = [=]()mutable->int {a++;std::cout << "内部a=" << a << std::endl; return b + c; }();
//按值传递时,匿名函数内默认不能修改外部变量值
//加上mutable修饰符就可以修改,但是按局部变量处理


std::cout << "x=" << x << std::endl;
std::cout << "外部a=" << a << std::endl;

return 0;

}


C++--- Lambda匿名函数表达式_匿名函数_03


returm-type---返回值类型

如果只有一处return时,可以省略,自动判断出类型

int ret=[]()->int{return 1000;}();

{}  语句实现体