使用 lambda 表达式的原因是以“更方便的方式”隐式生成函数对象。从下面的示例中可以看出,它不仅不那么方便而且更长,而且语法和符号也很混乱。
这个有什么用途吗,它实际上使代码更具可读性?
cout << count(vec, [&](int a){ return a < x; }) << endl; // lambda
cout << count(vec, Less_than<int> (x)) << endl; // normal functor def-n
它更具可读性,因为它将函数的实现直接放在调用它的位置,从而保持自然的自上而下的代码流不变。
你看,普通函数各有利弊。一方面,函数有助于减少代码中的重复,这使得代码更有条理,更易读。另一方面,函数破坏了代码的自然流动并将控制权转移到完全不同的位置。出于相当明显的原因,这会降低可读性:就像阅读一本充满嵌套前向和后向引用的书。
因此,为了正确利用普通函数的属性,应该使用它们来实现经过深思熟虑的、完整的和孤立的抽象。这样普通函数将提高代码的可读性。
但是对于小型的“一次性”一次性实用程序代码,普通函数就不能很好地工作了。它们实际上可以使代码的可读性大大降低。这就是 lambda 函数的用武之地。它们允许将一次性实用程序代码直接注入调用点,这是必要的。
lambda 表达式的存在是为了简化代码。这:
auto fun = []() { return; };
被编译器替换为:
// Namespace scope
struct __lambda_1 {
void operator()() { return; }
};
// local scope
__lambda_1 fun{};
这是 lambda 语法的主要动机:用在需要它的站点声明的更易于阅读的匿名函数替换传统的函数对象,而不是必须在另一个范围内声明一个单独的函数对象。它不仅仅是替换命名的函数对象。
实际上,标准库包含许多命名函数对象std::unary_function
,例如std::less
. 但这些对象的实用性有限,无法承担 lambda 所承担的所有潜在角色。
所以,是的,它可以使代码更具可读性,通过将标准库未提供的代码精确地放置在需要的位置,而不会用十几行struct
s 污染你的代码,也不会用你可能不再使用的名称污染你的命名空间不止一次或两次。