【问题标题】:What is lifetime of lambda-derived implicit functors in C++?C++ 中 lambda 派生的隐式函子的生命周期是多少?
【发布时间】:2011-03-05 23:18:26
【问题描述】:

问题很简单:当我编写 lambda 表达式时,C++ 编译器自动为我生成的函子对象的生命周期是多少?

我进行了快速搜索,但找不到满意的答案。特别是,如果我将 lambda 传递到某个地方,它在那里被记住,然后我超出范围,那么一旦我的 lambda 被稍后调用并尝试访问我的堆栈分配但不再活动的捕获变量,将会发生什么?或者编译器是否以某种方式阻止了这种情况?还是什么?

【问题讨论】:

  • 我猜你要么得到垃圾或 segfualt?
  • 好的,所以答案是“只是不这样做”?这个想法确实发生在我身上,但是......不要做什么?不记得函数指针?或者不将函数指针传递给函数? (这就是重点,不是吗?)或者根本不使用 lambda?换句话说,lambda 的预期用途是什么?我的意思是,除了在每个示例中一遍又一遍地编写的 STL 聚合/迭代函数调用中使用它们。

标签: c++ lambda


【解决方案1】:

取决于您如何捕获变量。如果您通过引用 ([&]) 捕获它们并且它们超出范围,则引用将无效,就像普通引用一样。如果您想确保它们超出其范围,请按价值 ([=]) 捕获它们。

【讨论】:

  • "取决于您如何捕获变量。如果您通过引用 ([&]) 捕获它们并且它们超出范围,则引用将无效,就像普通引用一样。":为什么那么这首先允许吗?
  • 在使用前不会超出范围。
  • 允许正常引用的所有相同原因。
  • @Giorgio 因为有什么替代方案?让 C++ 成为垃圾收集语言?
  • @jalf,不是,但可以禁止返回包含通过引用捕获的变量的 lambda,因为这显然是不正确的,可以通过静态分析检测到。
猜你喜欢
  • 2011-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 2010-09-19
相关资源
最近更新 更多