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