Не уверен, что это единственная проблема, но есть проблема.
В следующей функции
std::function<double(A*)> anon(std::function<double(A*, A*)> f, A& x, A& y)
{
std::function<double(A*)> result = [&](A * param_)
{
// Program fails somewhere at that point
double sum = 0.0;
for (unsigned i = 0; i < x.s; i++)
sum += f(param_, &x) - y.d[i];
return sum;
};
return result;
}
возвращаемое лямбда получает f
по ссылочному биту anon()
получает f
по копии.
Поэтому, когда вы вызываете возвращаемую лямбду за пределами anon()
, она содержит висячую ссылку на f
.
Предложение: попробуйте передать f
в лямбду-копию.
// ....................................V f by copy
std::function<double(A*)> result = [&, f](A * param_)
{ /* lambda content */ }