c++ - 有什么理由不使用全局 lambda 表达式?

标签 c++ lambda

我们有一个函数,它使用自身内部的非捕获 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,如范围自定义点),那么您应该使用通用机制。

在适当的情况下,优先选择预期的解决方案而不是新颖的解决方案。使用最简单的方法来表达你的观点。

关于c++ - 有什么理由不使用全局 lambda 表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59345286/

相关文章:

java - 如何将字符串流转换为字符串流对?

c++ - Doxygen 包含图

c++ - 单独输入线程上的 OpenGL 无效操作错误

c++ - map of map 的 typedef 别名

c++ - 为什么我不能在 C++11 中创建一个 lambda vector (相同类型)?

C++ lambda : good reference vs. 错误引用

c# - 将 2 个参数的 Lambda 表达式转换为 1 个参数的 Lambda 表达式(指定一个参数)

c++ - 如何在 MFC 中重定向 TRACE 语句以减少来自 AfxDumpStack() 的数据流?

c++ - 在 C++ 中重载 [] 和 = 运算符以接受我的模板类的值

c++ - 这条线是如何打印数组的?