Я пытаюсь вызвать функцию «testfun» внутри функции «test», используя «std:: function», уменьшая количество переменных на 1 и выполняя промежуточные вычисления.
Класс «А» (вектор) содержит одномерный массив двойных значений.
Во время выполнения программа останавливается в указанной точке и 'функциональный' файл открывается на 'const auto _Impl = _Getimpl();' линия. Как решить проблему?
#include <functional>
class A
{
public:
double* d;
unsigned s;
A(unsigned size)
{
s = size;
d = new double[s];
}
};
double testfun(A* param, A* x)
{
return param->d[0] + param->d[1] * x->d[0];
}
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;
}
double test(std::function<double(A*, A*)> f)
{
A x(1); A y(1);
x.d[0] = 0.0;
y.d[0] = 2.0;
A* param = new A(2);
param->d[0] = 2.0; param->d[1] = 6.0;
std::function<double(A*)> func = anon(f, x, y);
return func(param);
}
void main()
{
double t = test(testfun);
}
«программа завершается в указанной точке»: указано как?
Я добавил комментарий с точкой, где программа не работает
изменение 'void' на 'int' не кажется решением =)
Это неопределенное поведение anon
принимает f
по ссылке, но f
является локальным, у вас есть оборванная ссылка в result
.
Не уверен, что это единственная проблема, но это проблема.
В следующей функции
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 */ }
Да, похоже, это проблема. Как его правильно закодировать? Я попытался создать копию «f», например std::function<double(A*, A*)> f1 = f;
, но это приводит к той же ошибке.
@Perotto - как было предложено в конце ответа, попробуйте передать f
лямбде путем копирования: std::function<double(A*)> result = [&, f](A * param_)
Тип возвращаемого значения
main
должен бытьint
.