【发布时间】:2016-05-10 06:30:53
【问题描述】:
有几种方法可以将可调用对象作为参数传递或存储它们以备将来使用。您可以使用operator() 创建一个类,您可以定义一个函数并传递一个指向它的指针,并且从 C++11 开始,您可以通过[](){} 语法定义一个 lambda。
我很欣赏 lambda 语法作为表达式中的快捷方式,例如 find_if,它经常要求一个紧凑的可调用表达式。我对 lambda 的不理解是希望在声明之外使用它们,并有可能引入悬空引用等。 C++ 已经有一种强大的方法来传递可调用对象,它比 lambda 更安全,在这种情况下,lambda 的紧凑表达式没有任何好处。
因此问题是:为什么 C++11 允许在声明 is 的函数或从中调用的函数之外使用 lambda(因此引入了悬空引用等风险)?你能举一个例子,让 lambda 保持在声明函数之外是可取的吗?
【问题讨论】:
-
如果 lambdas 不可复制,您将无法将它们与
find_if一起使用 -
故事有两个方面——首先是为什么 C++ 允许它们是可复制的——这只是为了将它们传递给算法,算法通过值接受它们的参数。另一个问题是为什么有些人滥用它并真正制作长期存在的 lambdas 副本。我不知道。
-
@SergeyA 为回调存储一个长期存在的 lambda 副本对我来说似乎很好。你认为滥用 lambdas 吗?
-
@Praetorian:更改标题以澄清。
-
@Michael 您认为安全的替代方案是什么?您提到了一个传递可调用对象的强大功能。你指的是什么?
标签: c++ c++11 lambda language-lawyer