c++ - Quando "this" é capturado por um lambda, ele precisa ser usado explicitamente?




this-pointer (2)

Os exemplos que encontrei que capturam this em um lambda o usam explicitamente; por exemplo:

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

Mas parece que também é possível usá-lo implicitamente; por exemplo:

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

Eu testei isso em g ++, e ele compilou.

Isso é C ++ padrão? (e, em caso afirmativo, qual versão) ou é alguma forma de extensão?


É completamente padrão e tem sido desde que as lambdas foram introduzidas no C ++ 11.

Você não precisa escrever this-> lá.


É padrão e tem sido assim desde C ++ 11, quando foram adicionadas lambdas. De acordo com cppreference.com :

Para fins de pesquisa de nome, determinando o tipo e o valor this ponteiro e para acessar membros de classe não estáticos, o corpo do operador de chamada de função do tipo de fechamento é considerado no contexto da expressão 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*
        };
    }
};




this-pointer