mylogo

退役程序员的茶室 RetiredCoder.cn

← 返回上一页

C++编程基础: 18. Lambda表达式

2025-04-19 06:22:32

本系列文章是配合我发布的《C++编程基础》系列视频教程的知识点总结和补充。这一节我们来讲讲Lambda表达式。

Lambda表达式常用格式

使用Lambda表达式可以定义匿名函数,它的常用格式如下:

[捕获列表] (参数列表) {函数体}

例如定义打印一个整型参数的匿名函数可以这样编写和调用:

[](int x){std::cout<<x<<std::endl;}(9);

输出结果:

9

另外,如果明确给出返回值类型,可以用“-> 返回值类型”的格式插入尾置返回类型 :

[捕获列表] (参数列表) -> 返回值类型 {函数体}

例如可以将比较两个整数返回最大值的函数按如下方式编写和调用:

int maxXY = 0;
maxXY = [](int x, int y)->int{
    if(x>y){
        return x;
    }else{
        return y;
    }
}(23,172);
std::cout<<"max:"<<maxXY<<std::endl;

输出结果:

maxXY:172

[捕获列表] 的用法

以下给出常用的捕获列表格式:

[]:不捕获外部的任何变量

[=]:以赋值的方式捕获所有的外部变量

[&]:以引用的方式捕获所有的外部变量

[this]:捕获当前类的this指针

另外,还可以特殊指定具体变量使用何种方式捕获,例如:

[x, &y]:变量x以赋值的方式被捕获, 变量y以引用的方式被捕获

[&, x]:以引用的方式捕获所有的外部变量,除了变量x用赋值的方式

例如可以将比较两个整数返回最小值的函数按如下方式编写和调用(注意,这两个整数的值都来自匿名函数之外的变量):

int x = 36, y = 13;
int minXY = 0;
minXY = [x, y]()->int{
    if(x<y){
        return x;
    }else{
        return y;
    }
}();
std::cout<<"minXY:"<<minXY<<std::endl;

输出结果:

13

如果我们想在匿名函数中改变变量x,y的值,可以在捕获时用引用的方式[&x, &y]:

int x = 36, y = 13;
int minXY = 0;
minXY = [&x, &y]()->int{
    x=21;
    y=58;
    if(x<y){
        return x;
    }else{
        return y;
    }
}();
std::cout<<"minXY:"<<minXY<<std::endl;
std::cout<<"x:"<<x<<std::endl;
std::cout<<"y:"<<y<<std::endl;

输出结果:

minXY:21
x:21
y:58

默认情况下,用赋值方式捕获的外部变量在匿名函数里的拷贝是不允许修改的,如果想在匿名函数里修改它们的值,需要在函数体大括号前使用关键字mutable:

int x = 36, y = 13;
int minXY = 0;
minXY = [x, y]()mutable{
    x=21;
    y=58;
    if(x<y){
        return x;
    }else{
        return y;
    }
}();
std::cout<<"minXY:"<<minXY<<std::endl;
std::cout<<"x:"<<x<<std::endl;
std::cout<<"y:"<<y<<std::endl;

输出结果:

minXY:21
x:36
y:13

注意,这种方式与直接使用引用方式捕获不同,它并不会改变外部变量实际的值。