2013-06-04 19 views
7

Sto giocando con C++ 11 per divertimento. Mi chiedo perché questo accade:utilizzando le variabili fuori ambito in espressioni lambda C++ 11

//... 
std::vector<P_EndPoint> agents; 
P_CommunicationProtocol requestPacket; 
//... 
bool repeated = std::any_of(agents.begin(), agents.end(), 
        [](P_EndPoint i)->bool 
        {return requestPacket.identity().id()==i.id();}); 

compilazione termina con questo errore:

error: 'requestPacket' has not been declared 

che è dichiarato in precedenza nel codice. Ho provato ::requestPacke e non ha funzionato troppo.

Come è possibile utilizzare una variabile di ambito esterna all'interno di una funzione lambda?

+0

Sono in parte un metodo di una classe. Non è un buon titolo, forse dovrei cambiarlo in "fuori dal campo di applicazione" ... –

risposta

24

È necessario capture the variable, sia per valore (utilizzando la sintassi di [=])

bool repeated = std::any_of(agents.begin(), agents.end(), 
        [=](P_EndPoint i)->bool       
        {return requestPacket.identity().id()==i.id();}); 

o con riferimento (utilizzando la sintassi [&])

bool repeated = std::any_of(agents.begin(), agents.end(), 
        [&](P_EndPoint i)->bool 
        {return requestPacket.identity().id()==i.id();}); 

Nota che, come sottolinea @aschepler, global variables with static storage duration are not captured , solo variabili a livello di funzione:

#include <iostream> 

auto const global = 0; 

int main() 
{ 
    auto const local = 0; 

    auto lam1 = [](){ return global; }; // global is always seen 
    auto lam2 = [&](){ return local; }; // need to capture local 

    std::cout << lam1() << "\n"; 
    std::cout << lam2() << "\n"; 
} 
+3

Lambdas non acquisisce mai globals, solo le variabili locali della funzione. – aschepler

+1

Tnx, ha aggiornato la risposta. – TemplateRex