c++ - 为什么人们会在声明范围之外使用 lambda 或从声明范围调用的函数?

标签 c++ c++11 lambda language-lawyer

有几种方法可以将可调用对象作为参数传递或存储它们以备将来使用。您可以使用 operator() 创建一个类,您可以定义一个函数并将指针传递给它,而且,从 C++11 开始,您可以通过 []() 定义一个 lambda {} 语法。

我很欣赏 lambda 语法作为表达式中的快捷方式,例如 find_if,它通常需要一个紧凑的可调用表达式。我对 lambda 不了解的是希望在声明点之外使用它们并冒着引入悬空引用等的风险。 C++ 已经有一种强大的方法来传递可调用对象,它比 lambda 更安全,在这种情况下,lambda 的紧凑表达式没有任何好处。

因此问题是:为什么 C++11 允许在声明 is 的函数或从它调用的函数之外使用 lambda(因此引入了悬空引用等风险)?您能否举例说明在声明函数之外保留 lambda 是可取的?

最佳答案

考虑一个注册为在未来事件发生时调用的函数。将它定义为 lambda 会很方便,但它必须超出其定义的范围:

例如

m_button->setOnClick(YOUR LAMBDA GOES HERE);

关于c++ - 为什么人们会在声明范围之外使用 lambda 或从声明范围调用的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35136754/

相关文章:

c++ - 使用 LLVM 进行静态源代码分析

c++ ->> 在流中留下 simbolst 吗?

c++ - open-std.org 是 C++11 标准文档的官方网站吗?

c++ - 具有模板化参数的 typedef 函数指针

java - Java 中 .NET 的 Lambda 表达式

c++ - 向着色器添加线不会画任何东西

c++ - 如何创建一个不需要调用者将参数 count 传递给它的可变参数函数?

c++ - 构造函数模板特化给出了对析构函数的 undefined reference

java - 如何(动态地)改变 Java 流的过滤条件?

Java Lambda |在字符串中查找字符串数组第一次出现的位置