支持版本
lambda
语法从c++ 11
开始支持,所以要注意配置编译环境到支持的标准版本。例如用g++
编译。则需要添加-std=c++11
。
示例命令如下
g++ -std=c++11 main.cpp
复制代码
当然了你可以选择更高版本进行编译,毕竟向前兼容,例如-std=c++2a
。
基础用法
基础语法
[函数对象参数] (操作符重载函数参数) mutable 或 exception 声明 -> 返回值类型 {函数体}
简单的空匿名函数
最简单的空函数,也没有返回值。
void test() {
const auto empty_call = []() {
printf("empty call.\n");
};
empty_call();
}
复制代码
全部值传递
将lambda
函数可见范围内的所有变量按值传递方式传入。但是不可修改,可以理解为是常量。
void test() {
int a = 2;
int b = 5;
const auto empty_call = [=]() {
printf("a = %d b = %d\n", a, b); // a = 2 b = 5
};
empty_call();
}
复制代码
值传递且参数可变
将lambda
表达式可见范围内的所有变量按值传递方式传入。但是可修改,即变量。
由于是按值传递,所以即使在lambda
函数内修改了变量,但是修改的只是副本。
注意由于使用了mutable
修饰,所以该lambda
函数不能修饰为const
。
void test() {
int a = 2;
int b = 5;
auto empty_call = [=]() mutable {
a = 3;
printf("a = %d b = %d\n", a, b); // a = 3 b = 5
};
empty_call();
printf("a = %d b = %d\n", a, b); // a = 2 b = 5
}
复制代码
除了
mutable
修饰,lambda
函数也和一般函数一样支持exception
修饰。
全部按引用传递
将lambda
函数可见范围内的所有变量按引用传递方式传入。所有引用如果是变量的话可修改。
语法为在[&]
。
按引用传递的lambda
函数可以用const
修饰,并不影响引用的可写性,只有值传递的mutating
才对是否可以启用const
有要求。
void test() {
int a = 2;
int b = 5;
const auto empty_call = [&]() {
a = 3;
printf("a = %d b = %d\n", a, b); // a = 3 b = 5
};
empty_call();
printf("a = %d b = %d\n", a, b); // a = 3 b = 5
}
复制代码
带参数及返回值
返回值用->
加返回类型即可。
void test() {
const auto call = [&](int i) -> int {
return i * i;
};
int a = 5;
int b = call(a);
printf("sqr(%d) = %d\n", a, b); // sqr(5) = 25
}
复制代码
指定参数传递
可以指定变量进行传递,且可以指定该变量是按值传递还是引用传递。
该指定操作可以和=
复合执行,复合的含义是除了指定的变量,其它变量统一按值传递,例如[=, &i]
。
void test() {
int i = 5;
int k = 5;
// 指定i按引用,k按值传递
auto call = [&i, k]() mutable {
i++;
k++;
};
call();
printf("i = %d k = %d\n", i, k); // i = 6 k = 5
}
复制代码
void test() {
int i = 5;
int k = 5;
// 指定i按引用,其它所有变量按值传递
auto call = [=, &i]() mutable {
i++;
k++;
};
call();
printf("i = %d k = %d\n", i, k); // i = 6 k = 5
}
复制代码
lambda
与模板(std::c++20
起)
c++
后续的新特性使得lambda
支持模板,但是写起来有点略为繁琐。下面是两个比较简单的例子。
void test() {
const auto f = [] <size_t esize> () {
printf("size = %lu\n", esize);
};
f.template operator()<16>(); // size = 16
f.template operator()<32>(); // size = 32
}
复制代码
void test() {
const auto call = []<typename T>(T a) {
std::cout << "output: " << a << std::endl;
};
call("hello, world."); // output: hello, world.
call(1); // output: 1
call(3.14); // output: 3.14
}
复制代码