Lambdas - неназванный тип, который может быть сохранен в std::function
. Здесь важное различие. Вы можете придумать объявление лямбда, очень похожее на объявление класса функтора. Пример:
std::vector<int> vec(......);
auto& lambda = [vec](int x) -> void {};
Мы создали копию vec и получили int во время вызова в стеке. Ваша лямбда в этом случае примерно соответствует этому классу
class mylambda
{
public:
mylambda(const std::vector& vecin) : vec(vecin) {}
void operator() (int x) const {}
private:
std::vector<int> vec;
};
Обратите внимание, что захваты по значению копируется в. Эталонные захватах хранятся в основном в качестве указателей. По всей вероятности, ваш компилятор отложит строительство лямбда как можно дольше. В конце концов, хотя захваты будут сохранены в объекте.
Назад к std::function
- если вы решите скопировать лямбда в объект функции, потому что вы, возможно, захотите передать его за пределами собственной функции, то ваш лямбда-объект будет скопирован (или перемещен в зависимости от вашего синтаксиса) в функциональный объект. В приведенном выше примере ваш функциональный объект действительно сохранит вектор, хотя имейте в виду, что вектор сохраняет свою полезную нагрузку в куче (возможно, используя собственный распределитель).
* «C++ Lamdas производят функцию std ::» * Нет, они этого не делают. – CoryKramer
ok C++ lamdas производит что-то, что может быть назначено на std :: function – doron