Wenn „dies“ von einem Lambda erfasst wird, muss es explizit verwendet werden?


27

Die Beispiele, die ich gefunden habe, dass Capture thisin einem Lambda es explizit verwenden; z.B:

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

Es scheint aber auch möglich zu sein, es implizit zu verwenden. z.B:

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

Ich habe dies in g ++ getestet und es kompiliert.

Ist das Standard C ++? (und wenn ja, welche Version) oder handelt es sich um eine Erweiterung?


1
Die Antworten sind korrekt, aber es gibt einen möglichen Grund für die this->explizite Verwendung , nämlich sicherzustellen, dass explizit erfasste Werte explizit verwendet werden. Beachten Sie, dass [](){ calstage1done(); }dies nicht legal wäre, da thises nicht erfasst würde. Bei der thisexpliziten Erfassung ist es jedoch überraschend, dass der Funktionskörper auf einen Blick erscheint und den erfassten Wert nicht tatsächlich verwendet : [this](){ calstage1done(); }.
Kyle Strand

Ich kann das irgendwie sehen, aber gleichzeitig scheint es für eine einfache Aufgabe schrecklich ausführlich zu sein.
Plugwash

1
Ich erinnere mich, dass MSVC (vielleicht erst 2015) auch Probleme mit der Erfassung thisund Verwendung in einem Lambda hatte, was auch ein Grund sein könnte, es explizit zu verwenden
Flamefire

@plugwash: Entwickler neigen dazu, immer faul zu sein und Dinge zu minimieren, und Sprachdesigner sind nicht anders. Ausführlichkeit ist jedoch häufig erforderlich, um Mehrdeutigkeiten aufzulösen, und das ist hier der Fall.
Flater

Antworten:


25

Es ist Standard und seit C ++ 11, als Lambdas hinzugefügt wurden, so. Laut cppreference.com :

Für die Namenssuche, die Bestimmung des Typs und des Werts des thisZeigers und für den Zugriff auf nicht statische Klassenmitglieder wird der Hauptteil des Funktionsaufrufoperators des Schließungstyps im Kontext des Lambda-Ausdrucks berücksichtigt.

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*
        };
    }
};

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.