c++ - C++11 lambda 本身是否受制于 RAII 自动释放?

标签 c++ c++11 lambda raii

我想编写一个类方法,它可以选择接受 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/

相关文章:

C++11 正则表达式不匹配任何内容

c++ - 为什么 clang++ 不能推断出 lambda 映射的类型?

c++ - 谷歌 SketchUp C++ SDK : SkpWriter usage

c++ - 如何获取 std::ostream.write 的指针进行序列化

c++ - 继承类型定义?

使用显式定义的谓词时出现 C# 错误

C++:boost::asio:async_resolve() 不起作用(使用 lambda 函数),但 resolve() 起作用

c++ - C++中的默认模板参数

c++ - 调试英特尔的 TBB 容器

c++ - 使用迭代器执行对象操作的函数