#include <iostream>
using namespace std;
/*
LAMBDA (névtelen függvény / closure):
------------------------------------
Szintaxis: [capture](paraméterek) -> visszatérési_típus { törzs }
- Úgy viselkedik, mintha egy funktor (függvényobjektum) lenne, csak nem kell hozzá külön struct-ot vagy class-t írni.
- Legfontosabb plusz tudása a capture: bele tudja „zárni” a környezetéből a változókat.
- A fordító egy NÉVTELEN FUNKTOR TÍPUST generál.
- A "capture" rész adja meg, milyen KÜLSŐ változókat zárunk bele az objektumba.
[] : semmit nem vesz át
[=] : mindent érték szerint (MÁSOLAT)
[&] : mindent hivatkozással (REF)
[x] : csak x érték szerint
[&x]: csak x hivatkozással
*/
int lambdas_osszeadas(int a, int b) {
// Egyszerű lambda: nincs capture, csak paraméterek
// Megjegyzés: a fordító "auto" típusú névtelen funktorra fordítja.
int res = ([](int x, int y) { return x + y; })(a, b);
return res;
}
int hozza_k_ertek_szerint(int x, int k) {
// [k] => k érték szerint kerül be (MÁSOLAT). A k későbbi külső módosítása itt nem látszik.
int res = ([k](int v) { return v + k; })(x);
return res;
}
void ref_capture_novel(int& a, int b) {
// [&a] => a Hivatkozással kerül be: a lambda belsejében végzett módosítás kint is megjelenik.
([&a, b]() { a += b; })(); // rögtön meg is hívjuk (paraméter nélküli lambda)
}