编程语言
首页 > 编程语言> > C++11——lamada表达式

C++11——lamada表达式

作者:互联网

lamada表达式的语法

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

demo:

#include <iostream>
#include <functional>

using namespace std;

void fun(function<int(int, int)> fun)
{
cout << fun(10, 20) << endl;
}

int main()
{
fun([=](int a, int b)->int {
return a + b;
});
getc(stdin)
return 0;
}

外部变量的捕获规则

值捕获

值捕获和参数传递中的值传递类似,被捕获的变量的值在Lambda表达式创建时通过值拷贝的方式传入,因此随后对该变量的修改不会影响影响Lambda表达式中的值。

int main()
{
   int a = 123;
   auto f = [a] { cout << a << endl; }; //此处并不会输出
   a = 321;
   f(); // 输出:123
}

引用捕获

使用引用捕获一个外部变量,只需要在捕获列表变量前面加上一个引用说明符&。如下:

int main()
{
int a = 123;
auto f = [&a](){cout << a << endl;};
a = 321;
f();
return 0;
}

隐式捕获

我们可以让编译器根据函数体中的代码来推断需要捕获哪些变量,这种方式称之为隐式捕获。隐式捕获有两种方式,分别是[=]和[&]。[=]表示以值捕获的方式捕获外部变量,[&]表示以引用捕获的方式捕获外部变量。

捕获形式说明
[] 不捕获任何外部变量
[变量名, …] 默认以值得形式捕获指定的多个外部变量(用逗号分隔),如果引用捕获,需要显示声明(使用&说明符)
[this] 以值的形式捕获this指针
[=] 以值的形式捕获所有外部变量
[&] 以引用形式捕获所有外部变量
[=, &x] 变量x以引用形式捕获,其余变量以传值形式捕获
[&, x] 变量x以值的形式捕获,其余变量以引用形式捕获

修改捕获变量

在Lambda表达式中,如果以传值方式捕获外部变量,则函数体中不能修改该外部变量,否则会引发编译错误。那么有没有办法可以修改值捕获的外部变量呢?这是就需要使用mutable关键字,该关键字用以说明表达式体内的代码可以修改值捕获的变量,示例:

int main()
{
int a = 123;
auto f = [a]()mutable{cout <<++a;};//不会报错
cout <<a << endl;//输出123
f();//输出124
}

 

标签:11,变量,int,捕获,C++,外部,lamada,引用,cout
来源: https://www.cnblogs.com/HadesBlog/p/12572415.html