定义lambda的一般准则

the*_*ill 6 c++ lambda c++11

现在我们可以在代码库中使用C++ 11 lambdas,我们正在努力解决如何定义和使用它们的一般原则.我意识到这确实存在主观因素,但我认为也可能有一些更为一般的经验法则对社区有用.

定义lambda的一般原则是什么?

  • 您何时应该通过引用[&]或值来捕获[=]?性能影响是什么?
  • 您何时应该明确地捕获变量,例如[&foo]
  • 在什么情况下你应该指定一个返回类型?(C++ 14比C++ 11更好地支持推断返回类型)
  • lambda在被重写为函数之前有多复杂?

就个人而言,我目前的一般原则是"只要你需要一个简单的谓词或比较器使用lambda",但这可能意味着我错过了一些更强大的用例.

Sin*_*all 3

这些问题有些主观,但我会尝试一下:

  • 当您需要修改封闭范围内的值(显然),或者当您想避免复制大量变量时,通过引用捕获;否则按价值捕获。

  • 如果您需要修改封闭范围内的特定变量的值,而不是其他变量的值,请通过引用捕获特定变量。

  • 我尝试始终指定返回类型以提高可读性(以便其他人可以立即知道返回类型,而不必解析 lambda 来推导它)。

  • 最后一个是最主观的,但我个人认为大于 3-5 行的 lambda 应该重构为函数,因为长 lambda 会降低可读性。然而,可能有很多例外,所以这只是个人喜好的问题,很大程度上取决于实际的代码。