Лямбда-выражение в качестве параметра функции


какова нотация для объявления лямбда-переменной или параметра функции без использования auto или шаблоны? Есть ли способ сделать это? Или компилятор определяет уникальный объект класса для каждой лямбды, имя которой неизвестно программисту до времени компиляции? Если да, то почему? Разве они не могут быть просто переданы как какой-то указатель функции? Было бы большим разочарованием, если бы это было невозможно.

2 58

2 ответа:

лямбды могут содержать состояние (например, захваченные ссылки из окружающего контекста); если они этого не делают, они могут быть сохранены в указателе функции. Если они это делают, они должны храниться как объект функции (потому что нет места для сохранения состояния в указателе функции).

// No state, can be a function pointer:
int (*func_pointer) (int) = [](int a) { return a; };

// One with state:
int b = 3;
std::function<int (int)> func_obj = [&](int a) { return a*b; };

вы можете использовать полиморфная оболочка для объекта функции. Например:

#include <functional>

std::function<double (double, double)> f = [](double a, double b) { return a*b };