21xrx.com
2024-12-22 17:55:42 Sunday
登录
文章检索 我的文章 写文章
C++11 Lambda表达式分类详解
2023-07-05 00:30:23 深夜i     --     --
C++11 Lambda表达式 分类 详解

Lambda表达式是C++11引入的一项重要特性,它可以用于定义匿名函数并创建可调用对象。Lambda表达式的语法非常简洁,但是却有多种形式,不同形式的Lambda表达式适用于不同的场景。本文将对Lambda表达式进行分类详解。

### 基本语法

Lambda表达式的基本语法为:


[capture list] (params list) mutable exception -> return type { function body }

* capture list:捕获外部变量列表,可以是值传递、引用传递等方式,为空表示不捕获任何外部变量。

* params list:参数列表,与普通函数的参数列表相同。

* mutable:表示Lambda表达式可以修改捕获的变量。

* exception:异常设定。

* return type:返回类型。

* function body:函数体。

### 函数对象

Lambda表达式可以创建函数对象,可以通过auto关键字自动推断出类型:


auto f = [] (int x, int y) -> int { return x + y; };

也可以显式指定函数对象的类型:


std::function<int(int, int)> f = [] (int x, int y) -> int { return x + y; };

### capture list

Lambda表达式可以捕获外部变量,捕获的方式有多种,如:

* 值传递:[=],表示以值传递的方式捕获所有外部变量。

* 引用传递:[&],表示以引用传递的方式捕获所有外部变量。

* 指定变量:[x, &y],表示以值传递的方式捕获变量x,以引用传递的方式捕获变量y。

### 参数列表

Lambda表达式的参数列表与普通函数的参数列表相同,可以有默认值、可变参数等:


auto f = [] (int x, int y = 10, ...) { /* function body */ };

### mutable

Lambda表达式默认不能修改捕获的外部变量,可以通过mutable关键字开启修改权限:


int x = 10;

auto f = [&] () mutable { x++; };

### 返回类型

Lambda表达式可以显式指定返回类型,也可以让编译器自动推断:


auto f = [] (int x, int y) { return x + y; }; // 自动推断返回类型

auto g = [] (int x, int y) -> int { return x + y; }; // 显式指定返回类型

### 闭包对象

Lambda表达式创建的函数对象成为闭包对象,它的形式就是一个类对象,包含了Lambda表达式的函数体、捕获的外部变量等信息。

Lambda表达式的多种形式提供了灵活而强大的功能,可以满足不同场景下的需求。通过深入理解Lambda表达式的各种形式和使用场景,可以更好地提高C++程序的开发效率。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复