是否可以将lambda函数定义为仅在本地使用,即在当前块(函数/方法)中?考虑一些代码将要执行多次的情况(因此将它放入函数中是合乎逻辑的)但它永远不会在块外使用。
void foo() {
auto bar = []() {
// some code applicable only inside foo()
};
bar();
bar();
bar();
}
与将bar()
声明为正常函数相比,此方法有哪些优点和缺点?
答案 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)
你可以做到。主要问题是它会更具可读性吗?把它放在外面可以减少压痕。
您应该问的问题:
答案 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并调用它,所有这些都在一行中。