Когда лямбда-выражения были впервые представлены в C ++ 11, в них можно было записывать только существующие переменные.Однако это было расширено в более поздних итерациях стандарта, и теперь вы можете определять элементы для типа замыкания, не обязательно захватывая переменную.Это именно то, что вы делаете в своем примере.
Возможно, более распространенное использование для этой функции "захвата выражения" - это включение захвата только перемещаемых типов по значению:
std::unique_ptr<Foo> foo = whatever();
[p = std::move(foo)]() {
p->bar();
}