我想编写一个类方法,它可以选择接受 lambda 来自定义其行为。所以在使用这个类时,我想知道是否需要担心 lambda 本身超出范围?
lambda 不会引用任何外部变量,所以我不担心变量的范围,只担心 lambda 本身的范围,我会在类中存储对它的引用。
我是否需要担心 lambda 本身是如何创建的/在哪里创建的?
最佳答案
在狭义情况之外,引用不会延长您所引用事物的生命周期。
使用对生命周期已过期的事物的引用是未定义的行为。
无状态 lambda 的未定义行为可能是“我什至不使用我的 this
指针”,所以你可能没问题。但是,如果您知道 lambda 将是无状态的,则可以存储一个函数指针。
现在,为了存储实际的 lambda,您的类必须基于该 lambda 类型进行模板化。如果它是一个无状态的 lambda,它几乎肯定会比对该 lambda 的引用一样小(或更小)。那么,为什么不只存储 lambda 的拷贝呢?
如果您存储的是 std::function<void()>
等等,这不是对 lambda 的引用。这是一个类型删除对象,它包装了一个 lambda 的拷贝。存储对 std::function<void()>
的引用在它超出范围之后将是一个坏主意,因为它不是无状态的,并且会在您尝试调用它时关闭并读取垃圾内存。
关于c++ - C++11 lambda 本身是否受制于 RAII 自动释放?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19961559/