掌握现代 C++:Lambda 在 C++14、C++17 和 C++20 中的演变
一、背景
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。
更多推荐



所有评论(0)