可以在本地使用lambda吗?

时间:2018-06-06 09:41:07

标签: c++ function lambda code-cleanup

是否可以将lambda函数定义为仅在本地使用,即在当前块(函数/方法)中?考虑一些代码将要执行多次的情况(因此将它放入函数中是合乎逻辑的)但它永远不会在块外使用。

void foo() {
    auto bar = []() {
        // some code applicable only inside foo()
    };

    bar();
    bar();
    bar();
}

与将bar()声明为正常函数相比,此方法有哪些优点和缺点?

5 个答案:

答案 0 :(得分:15)

如果可以选择这样做,那么请将lambda bar本地化为特定函数。

在C ++中,我们总是尽量将对象保持为本地对象。 (使代码更容易理解,简化文档,便于重构,& c。& c ..)

答案 1 :(得分:10)

我同意这是一个好习惯。高级逻辑几乎总是比低级逻辑更容易阅读。我经常以这种方式编写函数:

void foo()
{
  // introduce actors here
  auto something = make_something();

  // introduce detailed definitions
  auto bing = [&]()->bool { ... };  // define what binging means

  auto bong = [&]() { ... };  // define what bonging means

  // perform logic
  while (bing())
    bong();
}

请记住,从c ++ 17开始,lambdas默认为constexpr。 gcc et。人。经常完全优化它们。这些都不是性能考虑因素。

答案 2 :(得分:5)

你可以做到。主要问题是它会更具可读性吗?把它放在外面可以减少压痕。

您应该问的问题:

  1. 酒吧功能短吗?
  2. 是纯粹的功能,还是修改了什么?
  3. 它与foo紧密相关,还是可以在别处重复使用?
  4. 你想要另一级别的缩进吗?

答案 3 :(得分:5)

从正确/标准的角度来看,这当然是好的。除此之外,这个问题主要是基于意见的。

Lambda是C ++中的众多工具之一。他们在"复制粘贴之间添加另一层结构以便重复使用" (代码气味)和"将其提取为函数"。我个人非常喜欢函数本地lambda用于完全列出的目的:您正在重用一小段代码,这些代码只在此函数范围内有意义。

有一些论据要说它应该仍然是它自己的功能(因为你的所有功能都是5行或更短,对吧?好吧,我怀疑它......)。特别是,如果你想重用那个lambda代码,它应该肯定是它自己的函数。但在此之前,值得考虑将代码放在旁边的好处,而不是屏幕或更多的滚动。此外,两种方法都为操作命名,但lambda需要较少的开销(例如私有成员函数膨胀)。在同一页面上,向标题添加私有成员函数会触发重新编译,在.cpp中添加lambda则不会。

最后,考虑什么会使代码最具可读性。如果使用lambda或将其提取到函数之间的代码清晰度差异很小(不太可能),则编写代码的便利性开始变得重要,为此上述考虑因素起作用。

至于测试,它取决于您想要测试的细粒度。像return a && b && (a == b);这样的lambda表达式是否真的需要测试?如果它只是内联使用(即没有提取为lambda或函数),你会测试它吗?在某些时候它会浪费时间,但在SO答案中确定这一点是不可能的。

答案 4 :(得分:4)

这没有什么不妥,实际上这是lambdas的一大优势:你可以在你需要它们的地方定义它们,而不必编写一个仿函数类型。如果你想在尽可能最狭窄的范围内定义/声明你的东西,那么lambdas就是你的朋友。

你甚至可以更进一步做这样的事情:

 auto bar = []() {return true;}();

定义lambda并调用它,所有这些都在一行中。