2014-04-08 25 views
45

Quando stavo leggendo il Cocos2dx 3.0 API, ho trovato qualcosa di simile:Che cosa significa "[questo]" significa in C++

auto listener = [this](Event* event){ 
    auto keyboardEvent = static_cast<EventKeyboard*>(event); 
    if (keyboardEvent->_isPressed) 
    { 
     if (onKeyPressed != nullptr) 
      onKeyPressed(keyboardEvent->_keyCode, event); 
    } 
    else 
    { 
     if (onKeyReleased != nullptr) 
      onKeyReleased(keyboardEvent->_keyCode, event); 
    } 
}; 

Cosa [this] significa? Questa nuova sintassi è C++11?

+12

Questo è un lambda e si sta vincolando l'istanza corrente ad esso. – Zeta

+5

Significa che si acquisisce 'this'. – rightfold

+1

C'è davvero un punto per menzionare esplicitamente questo? Non sarebbe automaticamente catturato dal riferimento a 'onKeyPressed' e' onKeyReleased' (supponendo che siano membri di 'this'). Anche un avvertimento, 'keyboardEvent' è ora in possesso di una copia del puntatore' this' ... guai se tu 'keyboardEvent' riesci a sopravvivere a qualsiasi cosa' this' sta puntando a .... (problemi di durata dell'oggetto standard) –

risposta

57

Cosa significa [questo]?

Introduce un lambda - un oggetto funzione richiamabile. Mettendo this tra parentesi significa che la lambda acquisiscethis, in modo che i membri di questo oggetto siano disponibili al suo interno. Lambdas può anche catturare variabili locali, per valore o riferimento, come descritto nella pagina collegata.

Il lambda ha un sovraccarico di operator(), in modo che possa essere definito come una funzione:

Event * event = some_event(); 
listener(event); 

che verrà eseguito il codice definito nel corpo del lambda.

È questa nuova sintassi in C++ 11?

Sì.

+0

Non voglio essere PIA, e sono sinceramente interessato se il termine "* overload di' operator() '*" sia tecnicamente corretto qui? So che 'ClosureType' è un tipo e ha una funzione membro' operator() ', ma penso che non sia sovraccarico in nessun punto, o è vero? – luk32

+1

@ luk32 sovraccarica l'operatore integrato, proprio come fanno i sovraccarichi dell'operatore dichiarati dall'utente. –

+0

Beh, ** può essere ** che quando si parla di un operatore che può essere dichiarato solo come metodo di una classe, non è "sovraccarico" perché non è definito per tale classe per impostazione predefinita. Tuttavia per gli operatori è generalmente accettato di dire che sono "sovraccaricati" perché si dice sempre di qualsiasi cosa chiamabile già definita altrove. Di conseguenza, ogni definizione di operatore è "sovraccarico". – Ethouris