auto f = [](int a, int b)->int
{
return a * b;
};
f
здесь глобальная переменная некоторого анонимного типа, держа экземпляр анонимного объекта функции, определенной после operator=
. Такие анонимные функции объекты называются лямбда с, они могут произойти везде, где вы можете иметь некоторое выражение:
int main(int, char**) {
([](int a) {
cout << "lambda called with " << a << endl;
})(42);
return ([](int a, int b) { return a - 2 * b; })(42, 21);
}
Общий синтаксис такого лямбда-выражения заключается в следующем:
"["CAPTURE"]" PARAMETERS ["mutable"] [RETURN] { BODY }
CAPTURE
быть список нулевой руды больше
- переменная из охватывающей области, захват по значению
- переменные из области видимости, предшествует
&
, захват путем ссылкой
&
средства захватить все переменные из области видимости по ссылке
=
средства захватить все переменные из области видимости по значению
PARAMETERS
являются обычными списками параметров, которые вы знаете из функций, необязательно (начиная с C++ 14) с auto
и выводите тип.
mutable
позволяет лямбда изменять свои захваченные переменные.
факсRETURN
содержит спецификацию типа возврата, например. -> void
и BODY
содержит произвольные выражения и выражения.
Примечание что это всего лишь приблизительный эскиз синтаксиса, но он должен вас начать. Вы можете узнать больше о lambdas в стандарте, ищите «C++ 11 lambda» в Google или, например, here.
Btw, лямбда ничего привидение, вы не можете думать о ваших f
как грубый эквивалент следующего, "старый стиль" C++ код:
struct {
int operator()(int a, int b) const {
return a * b;
}
} f;
'f' нет функции, но лямбда –
HTTP: //en.cppreference. com/w/cpp/language/lambda Не уверен, что вы спрашиваете о 'decltype' – Praetorian
@Freddy' trailing return type', фактически ..;) – JSQuareD