传递给函数时C ++变量会丢失值

时间:2018-01-06 21:44:53

标签: c++ c++11 lambda

我正在创建计算数学表达式ax^2 + b*x + c的程序,a,b,c传递给quadraticExp()xquadraticExp(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正在失去其价值。为什么会发生这种情况?如何摆脱这种情况呢?
  • 我可以编写lambda对象//return auto f1 [&] (double x) -> double的完整定义,以便在函数中重用f1吗?

1 个答案:

答案 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函数中将abc作为引用传递,则它们在{ {1}}函数终止。因此,当您调用lambda(quadraticExp()之外)时,lambda函数中quadraticExp()ab的值未定义。

您必须通过传递它们,即(简化)使用c代替[=]

  

我可以写出lambda对象的完整定义// return auto f1 [&amp;](double x) - &gt;加倍我可以在函数中重用f1吗?

不确定理解......你的意思是这样吗? [警告:代码未经测试]

[&]