C++嵌套lambda按引用捕获变量出现异常结果原因求解
C++ Lambda按引用捕获异常结果原因解答
核心原因:触发了悬空引用导致的未定义行为
具体执行流程分析如下:
- 外层接收参数的lambda
foo的形参x是局部变量,生命周期仅存在于foo(2)的调用过程中,调用结束后x占用的栈空间会被标记为可复用。 - 使用
[&]捕获时,内层lambda捕获的是外层x的引用而非值副本,foo(2)调用结束返回内层lambda后,该引用已经变成悬空引用,访问它的行为属于C++标准明确规定的未定义行为。 - 你测试得到结果
9只是未定义行为的一种典型表现:编译器复用了已经失效的x的栈空间存储内层lambda的入参y=3,读取悬空引用时实际拿到的是y的值,因此计算得到3 * 3 = 9。该结果完全不可靠,换编译环境、编译参数都可能出现不同的输出甚至程序崩溃。 - 而使用
[=]按值捕获时,内层lambda会拷贝一份x的数值(即调用foo(2)时传入的2)存储在自身的捕获列表中,不受外层x生命周期结束的影响,因此计算结果2*3=6符合预期。
修正方案
如果需要在外层函数/ lambda执行结束后依然使用捕获的变量,必须使用按值捕获,或者确保捕获的引用指向的对象生命周期长于lambda本身。
内容的提问来源于stack exchange,提问作者Display Name
相关产品推荐
相关产品推荐

