2013-06-04 27 views
7

Gram z C++ 11 dla zabawy. Zastanawiam się, dlaczego tak się dzieje:używanie zmiennych out of scope w C++ 11 wyrażeń lambda

//... 
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();}); 

Kompilacja kończy się z tego błędu:

error: 'requestPacket' has not been declared 

która została zgłoszona wcześniej w kodzie. Próbowałem ::requestPacke i to też nie działa.

Jak mogę użyć zewnętrznej zmiennej zakresu wewnątrz funkcji lambda?

+0

Są w strona metoda klasy. To nie jest dobry tytuł, może powinienem go zmienić na 'out of current scope' ... –

Odpowiedz

24

Trzeba capture the variable, zarówno pod względem wartości (przy użyciu składni [=])

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

lub przez odniesienie (używając składni [&])

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

Zauważ, że jak @aschepler wskazuje global variables with static storage duration are not captured , tylko zmienne poziomu funkcji:

#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 nigdy nie przechwytuje globali, tylko zmienne funkcyjne-lokalne. – aschepler

+1

Tnx, zaktualizowano odpowiedź. – TemplateRex