为什么
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
时,一切都按预期工作。
在函数
derivative
中,变量delta
是一个局部变量,其生命周期随着函数derivative
的结束而结束。
如果通过引用捕获它,则 lambda 在调用时将使用无效引用,因为该变量不再存在。