2014-04-08 23 views
45

Kiedy czytałem Cocos2dx 3.0 API, znalazłem coś takiego:Co oznacza "[to]" oznacza w języku 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); 
    } 
}; 

Co [this] oznacza? Czy to nowa składnia w C++11?

+12

To lambda, a wiążąca jest do niej bieżąca instancja. – Zeta

+5

Oznacza to, że przechwytujesz "to". – rightfold

+1

Czy rzeczywiście istnieje wyraźny wzmiankę o "tym"? Czy nie zostanie automatycznie przechwycone przez odniesienie do 'onKeyPressed' i' onKeyReleased' (zakładając, że są członkami 'this'). Również ostrzeżenie "keyboardEvent" trzyma teraz kopię "tego" wskaźnika ... biada wam, jeśli "keyboardEvent" zdoła przeżyć to, co "to" wskazuje na .... (problemy ze standardowymi obiektami życia) –

Odpowiedz

57

Co oznacza [to]?

Wprowadza lambda - obiekt funkcji do wywołania. Wstawienie this w nawiasach oznacza, że ​​jednostka lambda przechwytuje przechwytywanie , dzięki czemu elementy tego obiektu są w nim dostępne. Lambdas może również przechwytywać zmienne lokalne, według wartości lub referencji, zgodnie z opisem na połączonej stronie.

lambda ma przeciążenia operator(), tak że można go nazwać jak funkcja:

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

które będą uruchamiać kod określony w korpusie lambda.

Czy to nowa składnia w C++ 11?

Tak.

+0

Nie chcę być PIA i jestem naprawdę zainteresowany tym, czy termin "* przeciążenie' operatora() '*" jest tutaj poprawny technicznie? Wiem, że 'ClosureType' jest typem i ma funkcję member' operator() ', ale myślę, że nie jest ona przeciążona w żadnym momencie, czy też jest? – luk32

+1

@ luk32 to przeciąża wbudowany operator, tak jak robią to deklarowane przez użytkownika przeciążenia operatora. –

+0

Cóż, ** może być **, gdy mówimy o operatorze, który może być zadeklarowany jako metoda klasy, nie jest "przeciążony", ponieważ nie jest on domyślnie zdefiniowany dla tej klasy. Jednak dla operatorów ogólnie przyjmuje się, że są oni "przeładowani", ponieważ zawsze mówi się o wszystkim, co można już nazywać. W rezultacie każda definicja operatora to "przeciążenie". – Ethouris