2013-06-04 8 views
7

Ich spiele mit C++ 11 zum Spaß. Ich frage mich, warum dies geschieht:Verwendung von Scope-Variablen in C++ 11 Lambda-Ausdrücke

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

Compilation endet mit diesem Fehler:

error: 'requestPacket' has not been declared 

, die früher in Code deklariert wird. Ich habe versucht ::requestPacke und es hat nicht funktioniert.

Wie kann ich eine externe Scope-Variable innerhalb einer Lambda-Funktion verwenden?

+0

Sie sind in Seite eine Methode einer Klasse. Das ist kein guter Titel, vielleicht sollte ich es in 'out of scope' ändern ... –

Antwort

24

Sie müssen capture the variable entweder durch Wert (unter Verwendung der Syntax [=])

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

oder durch Referenz (unter Verwendung der Syntax [&])

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

anzumerken, dass als @aschepler darlegt, global variables with static storage duration are not captured , nur Funktionsebenenvariablen:

#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 fangen niemals globale Variablen ein, nur funktionale lokale Variablen. – aschepler

+1

Tnx, aktualisierte die Antwort. – TemplateRex