В вашем простом примере хранение лямбды внутри std::function
не имеет никакого преимущества. Зачастую хранение лямбды с использованием auto
более эффективно, но также и весьма ограничительно. Версия auto
может служить только локальной переменной. Если вы хотите сохранить лямбду для дальнейшего использования, вы должны использовать std::function
.
Например, вы можете хранить лямбду внутри члена класса. Рассмотрим следующий класс:
class Foo
{
std::function<void()> callback_;
public:
void Bar(int value)
{
callback_ = [value] { DoStuff(value); }
}
/* other constructors and methods omitted */
}
В этом случае вы не можете использовать auto
, поскольку лямбда-тип является анонимным и доступен только в методе Bar
.
std::function
также полезен, если вы хотите использовать лямбда-выражения в качестве аргументов обычных функций. Функция не может узнать тип лямбды, но вместо этого может объявить параметр std::function
. Например:
void Foo(std::function<void()> callback);
...
Foo([](){ cout << "Lambda" << endl;});
Стоит отметить, что это не относится к шаблонам функций. При использовании лямбды в таком контексте обычно лучше позволить компилятору определять тип лямбды (аналогично использованию auto
). Например:
template <class F> void Foo(F&& callback) { /* details */ }
...
Foo([](){ cout << "Lambda" << endl;}