A C++ bevezeti a név nélküli függvényeket a következő szintaxissal:
Látható, hogy visszatérési érték típusát sehol nem adtuk meg. Ebben az esetben azért, mert egyértelmű. Nem kötelező visszatérési értéket megadni, ha a függvény törzse egyetlen return utasításból áll, ekkor a visszatérési értéket a fordító kikövetkezteti. Ha a függvény nem így épül fel, és nem adjuk meg a visszatérési érték típusát, az void lesz. A következő példában ki kell rakni a visszatérési érték típusát:
Az lambda kifejezések fel tudják használni a definíciójuk helyén látható változókat is. Ezeket a [] jelek között sorolhatjuk fel. A paraméter-átadás érték szerinti, hacsak nem jelöljük & jellel:
A fenti példa kiírja a tömbben található értékek összegét. A környezetből átvett változókat sem muszáj felsorolni (kivétel a this, amelyet explicit át kell adni), ha megadjuk az alapértelmezett paraméter-átadási módot: [&] a referencia szerinti, [=] az érték szerinti. Ezt felülbírálhatjuk, ha a változót explicit kiírjuk. Pl: [&, value] illetve [=, &ref]. Ekkor a value érték szerint, a ref referencia szerint adódik át.
Ha ilyen lambda kifejezést eltárolunk, és nem a definiálás helyén hívjuk meg, a viselkedés definiálatlan.
A C++ régi jól ismert problémája a sablon összeadás függvény, amely típusparamétereit a fordító nem tudja kikövetkeztetni (A Ret paraméter nem szerepel az argumentumokban).
A C++ új függvény szintaxist vezet be, amelyben használható a decltype kulcsszó is a visszatérési érték kiszámítására:
Az új szintaxist természetesen nem csak sablonokban használhatjuk:
A szabványos C++-ban belső változókkal nem szabad referencia szerint visszatérni, ez nem megjósolható viselkedéshez vezet. Érték szerinti visszatérésnél viszont az objektumot lemásoljuk, ami sok esetben nem hatékony.
Hasonló eset fordulhat elő ideiglenes változóknál. Ha egy kifejezést adunk át egy függvénynek, azt általában const & típussal oldjuk meg, ekkor viszont nem módosíthatjuk az értékét akkor sem, ha tudjuk, hogy az érték a függvény visszatérése után felszabadul.
Ezeket a problémákat egyszerűen meg lehet oldani a move konstruktor bevezetésével. Egy objektum move konstruktora úgy működik, hogy az eredeti objektum adatait átveszi úgy, hogy az eredetiből törli. Például szabványos könyvtár vector típusa úgy működik, hogy belül az adatokat tömbben tárolja. A move konstruktor egyszerűen ezt a mutatót átmásolja magának, és a helyére üres tömböt rak. Ha ezzel a konstruktorral tudnánk átadni értéket, nem lenne szükség a másolásra.
A probléma az, hogy hogyan különböztessük meg az érték szerinti, a referencia szerinti, és a move szemantikájú paraméter-átadásokat Ennek a megoldására a C++ bevezeti a jobbérték-referencia típusokat, amelyet typename && típussal jelölünk. Jobbérték-referencia típusú argumentumként csak olyan kifejezést lehet átadni, amely nem balérték. Balértéket csak úgy tudunk átadni, ha az std::move() függvénnyel beburkoljuk.
Visszatérés jobbérték-referenciával: