c++ - 如果我通过引用捕获局部变量并且超出范围会怎样?

标签 c++ lambda c++11

假设我使用 lambda 作为回调函数,并且在创建 lambda 时,我通过引用捕获了一个局部函数变量。现在假设 lambda 对象直到该局部函数变量超出范围后才被执行。会发生什么?

我意识到,如果有可能发生这种情况,那么某人这样做是非常愚蠢的,但我几乎肯定有人最终会这样做。

最佳答案

是的,那将是一个悬空引用。听起来你很担心界面设计:“我几乎肯定有人最终会这样做。”请不要在此基础上拒绝 lambda 和 std::function,因为它们并不比任何其他替代方案更危险。 Lambda 只是定义局部仿函数的一种更简单的方法。 std::function 是持久化、多态仿函数(无论是否为 lambda)的最佳接口(interface)。

范围问题是为什么它更容易按值(value)捕获。除非他们编写 &,否则用户不会得到引用。当然,危险在于有人会养成使用 [&] 启动所有 lambda 函数的习惯,因为引用“更快”。希望任何这样的人能尽快吸取教训……尽管有些乐于助人的人是不可救药的。

关于c++ - 如果我通过引用捕获局部变量并且超出范围会怎样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9488129/

相关文章:

c# - 为什么 `s => x.Append(s)` 可以作为 Action<string> 传递但 `x.Append` 不能?

c++ - lambda 的默认捕获是什么?

c++ - unordered_map 用于堆管理系统。是否可以进行无碰撞设置?

c++ - 为什么 lambda 参数的默认参数会触发“-pedantic”GCC 警告?

c++ - 通过模板检查 c++11 中是否存在函数(不是方法)

c++ - 获取二进制指令的内存地址

c++ - Bool 方法返回错误值

c++ - 将迭代器传递给 lambda

C++ 重组数组以填补空白?

c++ - 调试-进入操作系统功能?