我正在创建计算数学表达式ax^2 + b*x + c
的程序,a,b,c
传递给quadraticExp()
,x
从quadraticExp(a,b,c)(x)
传递。
#include<iostream>
#include<functional>
#include<cmath>
auto quadraticExp(double a, double b, double c) -> std::function<double(double)>
{
//return auto f1 [&] (double x) -> double
return [&] (double x)
{
std::cout<<a<<" "<<b<<" "<<c<<" "<<x<<std::endl;
return ( a*std::pow(x,2) + b*x + c );
};
}
int main()
{
double a={1.0}, b={1.0}, c={1.0}, x={3.0} ;
std::cout<<quadraticExp(a,b,c)(x)<<std::endl;
return 0;
}
输出是:
1 8.00798e-307 1.83847e-307 3
9
b,c
正在失去其价值。为什么会发生这种情况?如何摆脱这种情况呢?//return auto f1 [&] (double x) -> double
的完整定义,以便在函数中重用f1
吗?答案 0 :(得分:3)
因此变量b,c正在失去它们的值。为什么会发生这种情况?我该怎样摆脱它?
尝试
// .....v
return [=] (double x)
{
std::cout<<a<<" "<<b<<" "<<c<<" "<<x<<std::endl;
return ( a*std::pow(x,2) + b*x + c );
};
我的意思是......如果您在lambda函数中将a
,b
和c
作为引用传递,则它们在{ {1}}函数终止。因此,当您调用lambda(quadraticExp()
之外)时,lambda函数中quadraticExp()
,a
,b
的值未定义。
您必须通过值传递它们,即(简化)使用c
代替[=]
。
我可以写出lambda对象的完整定义// return auto f1 [&amp;](double x) - &gt;加倍我可以在函数中重用f1吗?
不确定理解......你的意思是这样吗? [警告:代码未经测试]
[&]