为什么这些相似闭包的捕获行为不同?

问题描述 投票:0回答:1

为什么

df
需要
&delta
来关闭,而
df2
只能与
delta
一起使用?我怀疑它与通过值或引用传递有关,但我不能完全确定它。

#include <iostream>
#include <cmath>
#include <iomanip>

template <typename Function>
auto derivative(Function f, const double delta) {
  return [&f,delta](double x)->double{
    return (f(x+delta) - f(x-delta)) / (2*delta);
  };
}

int main ()
{
    const double delta = 0.00001; 
    auto f = [](double x) -> double {return x * std::sin(x);};
    auto df = [&f,&delta](double x)->double{return (f(x+delta) - f(x-delta)) / (2*delta);};
    auto df2 = derivative(f,delta);

    for (double x = 0; x<5; x+= 0.5){
        std::cout << std::setprecision(4) << "f(" << x << ") = " << f(x) << " f'= " << df(x) << " f'2= " << df2(x) << std::endl; 
    }
}

我最初尝试在

&delta
内的闭包内使用
df2
作为
derivative
,但它将
delta
的值从
1e-5
更改为更低的值,例如
1e-301
。当我使用
delta
时,一切都按预期工作。

c++ lambda closures
1个回答
0
投票

在函数

derivative
中,变量
delta
是一个局部变量,其生命周期随着函数
derivative
的结束而结束。

如果通过引用捕获它,则 lambda 在调用时将使用无效引用,因为该变量不再存在。

© www.soinside.com 2019 - 2024. All rights reserved.