Quando "questo" viene catturato da un lambda, deve essere usato esplicitamente?


27

Gli esempi che ho scoperto che catturare thisin un lambda lo usano esplicitamente; per esempio:

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

Ma sembra anche possibile usarlo implicitamente; per esempio:

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

L'ho provato in g ++ e compilato.

Questo è C ++ standard? (e se sì, quale versione) o è una forma di estensione?


1
Le risposte sono corrette, ma esiste una possibile ragione per l'utilizzo this->esplicito, ovvero garantire che i valori acquisiti in modo esplicito vengano utilizzati in modo esplicito. Nota che [](){ calstage1done(); }non sarebbe legale, perché thisnon sarebbe stato catturato; ma durante la cattura thisin modo esplicito, è sorprendente per il corpo della funzione ad apparire a colpo d'occhio non effettivamente utilizzare il valore catturato: [this](){ calstage1done(); }.
Kyle Strand,

Posso vederlo, ma allo stesso tempo sembra orribilmente prolisso per quello che dovrebbe essere un compito semplice.
lavare i piatti il

1
Ricordo che MSVC (forse solo il 2015) aveva anche problemi con l'acquisizione thise l'utilizzo in una lambda che potrebbe anche essere un motivo per usarlo esplicitamente
Flamefire

@plugwash: gli sviluppatori tendono ad essere sempre pigri e vogliono minimizzare le cose, e i progettisti del linguaggio non sono diversi. Tuttavia, la verbosità è spesso richiesta per risolvere l'ambiguità, e questo è il caso qui.
Flater

Risposte:


25

È standard ed è stato così dal C ++ 11 quando sono stati aggiunti lambda. Secondo cppreference.com :

Ai fini della ricerca del nome, della determinazione del tipo e del valore del thispuntatore e dell'accesso ai membri di classe non statici, il corpo dell'operatore di chiamata della funzione del tipo di chiusura viene considerato nel contesto dell'espressione 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*
        };
    }
};

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.