Igen, ez egy szabályos kifejezés C++0x-ben. Mégpedig egy üres lambda-függvény meghívását takarja. A lambda-függvények az egyik legfontosabb újítás a C++0x-ben az rvalue-referenciák és az inicializálások automatikus típusegyeztetése mellett.
Egy lambda-függvényt mindig egy [] párral kezdünk. Ebben vannak az elfogott változóink felsorolása. Az elfogás azt jelenti, hogy a külső függvény egyik lokális változóját elérhetőve tesszük a lambda-függvény számára. Ez kétféleképpen történhet meg: érték szerint, és referencia szerint. A változókat egyszerűen vesszővel elválasztva soroljuk fel a szögletes zárójelek között. Amelyik változót referencia szerint adunk át, az elé tegyünk egy & jelet. Így:
[a, &b, c]
Itt az a és b értékszerint adódik át, a b referenciaszerint. Mivel a lambda-függvény valójában egy teljesen szabályos functor objektum, ezek a változók a tagváltozói lesznek. Ha nem akarunk vacakolni a felsorolással, használhatjuk az = és a & szimbólumokat is automatikus elfogáshoz. Az = minden nem felsorolt változót érték szerint fog el, a & minden nem felsorolt változót referencia szerint.
[&, a, c]
Ez a kód az a és c változókat érték szerint fogja el, az összes többit referencia szerint. Globális változókat a lambda-függvény automatikusan látja, így azokat nem kell elfogni. Tagváltozókat pedig nem lehet, viszont a thist el lehet fogni, igaz, csak érték szerint. A = és & szimbólumok automatikusan elfogják a thist, és mindig érték szerint. Ha pedig van this, akkor ugyanúgy használhatjuk a tagváltozókat a lambda-függvényben, mint a szülőfüggvényben. Ez azt jelenti, hogy látja a private és protected tagváltozókat is!
Ezután jön a paraméterlista. Ez egy teljesen szokványos paraméterlista. Ha nincs egyetlen paraméter sem, akkor a paraméterlista a zárójeleivel együtt elhagyható. A paraméterlistát követheti a visszatérési értek típusa egy -> jelet követően. Így:
(int x, int y) -> float
A visszatérési érték típusát csak akkor kell megadni, ha több return is van a függvényben. Egyetlen return esetén a visszaadott érték típusát képes automatikusan meghatározni. Ha visszatéresi érték típusát megadjuk kötelező kitenni a paraméterlistát, még akkor is, ha az üres.
Ezután jöhet a lambda-függvény utolsó része, a kódja. Ez a szabályos függvénytörzs. Ha értéket akarunk visszaadni, akkor használhatjuk a returnt.
Ahogy már említettem, a lambda-függvény valójában egy teljesen szabályos functor. Vagyis a függvény maga a () operátor lesz benne. Ráadásu abból is a const verzió. Ez pedig azt jelenti, hogy azokat az elfogott változókat, amiket érték szerint fogtunk el, nem tudja megváltoztatni. A referencia szerint elfogottakat viszont igen. Ha mégis meg akarjuk őket változtatni, akkor a függvény törzse elé a mutable kulcsszót kell írni. Így a nem const () operátort fogja létrehozni, és a functor tagváltozói mind írhatók lesznek. Persze egy pointer által mutatott értékre nem vonatkozik a constság, így azt nyugodtan átírhatjuk mutable nélkül is. Ugyanez áll az elfogott this által mutatott tagváltozókra.
void mul(vector<int>& v, int factor)
Ez a kód példáulk megszorozza egy vektor összes elemét factorral.
{
for_each(v.begin(), v.end(), [factor](int &value){value *= factor;});
}