gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:02:59 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com