我们有一个函数,它使用自身内部的非捕获 lambda,例如:
void foo() {
auto bar = [](int a, int b){ return a + b; }
// code using bar(x,y) a bunch of times
}
现在,其他地方需要 lambda 实现的功能,因此我将把 lambda 从 foo()
提升到全局/命名空间范围。我可以将其保留为 lambda,使其成为复制粘贴选项,或者将其更改为适当的函数:
auto bar = [](int a, int b){ return a + b; } // option 1
int bar(int a, int b){ return a + b; } // option 2
void foo() {
// code using bar(x,y) a bunch of times
}
将其更改为适当的函数很简单,但这让我想知道是否有某种原因不将其保留为 lambda?有什么理由不到处使用 lambda 而不是“常规”全局函数?
请您参考如下方法:
不使用全局 lambda 有一个非常重要的原因:因为它不正常。
C++ 的常规函数语法自 C 时代以来就已存在。数十年来,程序员都知道该语法的含义及其工作原理(尽管不可否认,整个函数到指针的衰减有时甚至会困扰经验丰富的程序员)。如果任何技能水平超出“完全新手”水平的 C++ 程序员看到函数定义,他们就会知道自己会得到什么。
全局 lambda 是完全不同的野兽。它的行为与常规函数不同。 Lambda 是对象,而函数不是。它们有一个类型,但该类型与其函数的类型不同。等等。
现在,您已经提高了与其他程序员沟通的标准。如果 C++ 程序员想要理解这个函数在做什么,就需要理解 lambda。是的,现在是 2019 年了,所以一个优秀的 C++ 程序员应该知道 lambda 是什么样的。但这仍然是一个更高的标准。
即使他们理解了它,程序员脑海中的问题也会是......为什么这段代码的作者要这样写?如果您对这个问题没有一个好的答案(例如,因为您明确想要禁止重载和 ADL,如范围自定义点),那么您应该使用通用机制。
在适当的情况下,优先选择预期的解决方案而不是新颖的解决方案。使用最简单的方法来表达你的观点。