Я не могу передать лямбду с захватом ссылки - PullRequest
5 голосов
/ 23 сентября 2019

Следующий код завершается ошибкой с этой ошибкой

E0413 не существует подходящей функции преобразования из "lambda [] float (int i) -> float" в "float (*) (int i)"

int test;   
float (*f)(int i) = [&](int i) -> float {return test; };

Как это исправить?Мне нужно предложение Capture.

Ответы [ 2 ]

4 голосов
/ 23 сентября 2019

Вы можете сделать вышеперечисленное только с лямбдами без захвата.

См. [expr.prim.lambda.closure] (с. 7)

Тип замыкания для неуниверсального лямбда-выражения с без лямбда-захвата , чьи ограничения (если есть) удовлетворены, имеет функцию преобразования вуказатель на функцию с языковой связкой C ++, имеющей тот же параметр и типы возврата, что и оператор вызова функции типа замыкания.

Поскольку лямбда-выражения - это не просто обычные функции и их захватнеобходимо сохранить состояние , вы не можете найти ни одного простого или обычного решения, чтобы заставить их назначать указатели на функции.


Для исправления можно использовать std::function, который сделает это по типу стирания:

#include <functional> // std::function

int test;
std::function<float(int)> f = [&](int i) -> float {return static_cast<float>(test); };
2 голосов
/ 23 сентября 2019

Лямбда (с перехватами) не совпадает с указателем функции и не может быть преобразована в единицу.

Лямбда без захвата может быть преобразована в указатель функции.

См. CPPReference , в частности, бит, который начинается:

Общая лямбда без захвата имеет определяемый пользователем шаблон функции преобразования с тем же самым изобретенным списком параметров шаблона, что ишаблон оператора вызова функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...