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?

płyn do płukania
źródło
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*
        };
    }
};
Ayxan
źródło
19

Jest to całkowicie standardowe i było od czasu wprowadzenia lambdów w C ++ 11.

Nie musisz this->tam pisać .

Lekkość Wyścigi na orbicie
źródło