一、背景

Lambda 是现代 C++ 最受欢迎的功能之一。自从在 C++ 11 中引入以来,它们在 C++ 代码中无处不在。而且,自从它们在 C++11 中出现以来,它们已经发展并获得了重要的功能。其中一些功能有助于编写更具表现力的代码,并且由于现在使用 lambda 非常普遍,因此花时间学习可以用它们做什么是非常值得的。

本文目标是剖析 lambda 的主要演变过程,但不是所有的小细节。对 lambda 的基础知识不了解可以阅读博主的另一篇文章,有详细介绍。

lambda 的演变一般是赋予它们手动定义函数对象的功能。

二、C++14 中的 Lambda

在 C++14 中,lambda 获得了 4 项主要增强功能:

  • 默认参数

  • 模板参数

  • 广义捕获

  • 从函数返回 lambda

2.1、默认参数

在 C++14 中,lambda 可以采用默认参数,就像任何函数一样:

代码语言:C++

自动换行

AI代码解释


auto myLambda = [](int x, int y = 0) { std::cout << x << '-' << y << '\n'; }; std::cout << myLambda(1, 2) << '\n'; std::cout << myLambda(1) << '\n';

输出:

代码语言:Bash

自动换行

AI代码解释


1-2 1-0

2.2、模板参数

在 C++11 中必须定义 lambda 参数的类型:

代码语言:C++

自动换行

AI代码解释


auto myLambda = [](int x){ std::cout << x << '\n'; };

在 C++14 中,可以让它们接受任何类型:

代码语言:C++

自动换行

AI代码解释


auto myLambda = [](auto&& x){ std::cout << x << '\n'; };

即使不需要处理多种类型,这对于避免重复并使代码更紧凑和可读也很有用。例如,这种 lambda:

代码语言:C++

自动换行

AI代码解释


auto myLambda = [](namespace1::namespace2::namespace3::ACertainTypeOfWidget const& widget) { std::cout << widget.value() << '\n'; };

变成:

代码语言:C++

自动换行

AI代码解释


auto myLambda = [](auto&& widget) { std::cout << widget.value() << '\n'; };

2.3、广义捕获

在 C++11 中,lambda 只能捕获其作用域中的现有对象:

代码语言:C++

自动换行

AI代码解释


int z = 42; auto myLambda = [z](int x){ std::cout << x << '-' << z + 2 << '\n'; };

C++14 借助强大的lambda广义捕获,可以用几乎任何东西初始化捕获的值。示例:

代码语言:C++

自动换行

AI代码解释


int z = 42; auto myLambda = [y = z + 2](int x) { std::cout << x << '-' << y << '\n'; }; myLambda(1);

输出:

代码语言:Bash

自动换行

AI代码解释


1-44

2.4、从函数返回 lambda

Lambda 受益于 C++14 的语言功能:从函数返回,而无需指定返回类型。由于 lambda 的类型是由编译器生成的,因此在 C++11 中无法从函数返回 lambda。

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐