Daniro_San
@Daniro_San
Программист

Ссылка на лямбду?

Простейшая лямбда:
auto lsqr = [](const int &n) -> int { return n*n; };

int (*pointer)(const int&) = lsqr; // Нормально
int (&refernce)(const int&) = lsqr; // Ошибка
//Нормально, извращение
int (&perversion)(const int&) = *(int(*)(const int&)) lsqr;

Почему можно сделать указатель на нее, но нельзя сделать ссылку?
  • Вопрос задан
  • 291 просмотр
Решения вопроса 1
tsarevfs
@tsarevfs Куратор тега C++
C++ developer
Для лямбд, которые не захватывают переменные в своих [], определен оператор преобразования в указатель на функцию(ClosureType::operator ret(*)(params)()). Собственно поэтому происходит неявный каст в вашем 1 примере. Для ссылки компилятор не находит подходящего преобразования.
Последний пример сначала преобразует лямбду к указателю и разыменовывает его уже просто как указатель.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
kozura
@kozura
non-const lvalue reference to type int (const int&)

int n = 5;
const std::function& refernce = std::bind([](const int &n) {return n*n; }, n);
const int& x1 = refernce();  // out: x = 25
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы