Kiedy „to” jest uchwycone przez lambdę, czy musi to być użyte jawnie?


27

Przykłady, które znalazłem, że chwytanie thisw lambda używa tego wprost; na przykład:

capturecomplete = [this](){this->calstage1done();};

Ale wydaje się, że możliwe jest również użycie go w sposób dorozumiany; na przykład:

capturecomplete = [this](){calstage1done();};

Przetestowałem to w g ++ i skompilowałem.

Czy to jest standardowy C ++? (a jeśli tak, to która wersja), czy jest to jakaś forma rozszerzenia?


1
Odpowiedzi są poprawne, ale istnieje możliwy powód this->jawnego użycia , który ma na celu zagwarantowanie, że jawnie przechwycone wartości zostaną użyte jawnie. Pamiętaj, [](){ calstage1done(); }że nie byłoby to zgodne z prawem, ponieważ thisnie zostałoby schwytane; ale podczas robienia thiswyraźnie, że to zaskakujące dla organizmu funkcji, aby pojawić się na pierwszy rzut oka nie do faktycznie korzysta z przechwyconego wartość: [this](){ calstage1done(); }.
Kyle Strand

Widzę to w pewnym sensie, ale jednocześnie wydaje się okropnie gadatliwe, co powinno być prostym zadaniem.
plugwash

1
Pamiętam, że MSVC (może tylko 2015) ma również problemy z przechwytywaniem thisi używaniem go w
lambdzie,

@plugwash: Programiści zawsze są leniwi i chcą minimalizować rzeczy, a projektanci języków nie różnią się. Jednak często wymagana jest gadatliwość, aby rozwiązać niejednoznaczność, i tak jest w tym przypadku.
Flater

Odpowiedzi:


25

Jest to standard i tak było od C ++ 11, kiedy dodano lambdy. Według cppreference.com :

Do celów wyszukiwania nazwy, określania typu i wartości thiswskaźnika oraz uzyskiwania dostępu do niestatycznych elementów klasy, treść operatora wywołania funkcji typu zamknięcia jest rozpatrywana w kontekście wyrażenia lambda.

struct X {
    int x, y;
    int operator()(int);
    void f()
    {
        // the context of the following lambda is the member function X::f
        [=]()->int
        {
            return operator()(this->x + y); // X::operator()(this->x + (*this).y)
                                            // this has type X*
        };
    }
};

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.