Treść książki

Przejdź do opcji czytnikaPrzejdź do nawigacjiPrzejdź do informacjiPrzejdź do stopki
Rozdział2
NowoczesnyC++
Kodtenpokazuje,jakdefiniowaćwyrażenialambdawkodzieźródłowymC++.Skład-
nialambdawyglądanastępująco:
[](){};
Nawiasykwadratowereprezentująblokprzechwytujący(captureblock).Wyrażenie
lambdaużywablokudoprzechwyceniaistniejącychzmiennych,któremająbyćużyte
wwyrażeniu.Kodzlistingu2-20niepotrzebujeprzechwytywaćżadnychzmiennych;
tymsamymblokjesttupusty.Nawiasyreprezentująblokargumentów,taksamojak
wzwykłejfunkcji.Wyrażenielambdazlistingu2-20mapojedynczyargument,którego
typemjest
auto&&
.Algorytm
std::for_each
stosujekolejnopodanąfunkcjędokażdego
elementutablicy.Pokazanawtymprzykładziefunkcjaokazujesiębyćdomknięciem,
którezostałoutworzonaprzezkompilator,gdynatrafiłonnaskładnięlambda-jestono
przekazywanedofunkcji
for_each
.Mamytusubtelnąróżnicęterminologiczną,którą
należydobrzeopanować.Lambdajestkonstrukcjąkoduźródłowego,któradefiniuje
funkcjęanonimową(nienazwaną).Kompilatorużywatejskładnidoutworzeniaobiektu
domknięciazwyrażenialambda.Upraszczając,możnapowiedzieć,żedomknięcie(clo-
sure)jestdlawyrażenialambdatym,czymdlaklasyjestobiekt.
Dodomknięciamożnasięodwoływaćpoprzezzmienną,copokazujelisting2-21.
Listing2-21.Odwoływaniesiędodomknięciapoprzezzmienną
#include<algorithm>
#include<array>
#include<cstdint>
#include<iostream>
#include<typeinfo>
intmain()
{
usingMyArray
=
std::array<uint32_t,5>;
MyArraymyArray{1,2,3,4,5};
automyClosure=[](auto&&number){
std::cout<<number<<std::endl;
};
std::cout<<typeid(myClosure).name()<<std::endl;
46