Когда «this» захвачено лямбдой, нужно ли его использовать явно?


27

Примеры, которые я обнаружил, что захват thisв лямбде использует это явно; например:

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

Но кажется, что это также возможно использовать неявно; например:

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

Я проверил это в g ++, и это скомпилировано.

Это стандарт C ++? (и если да, то какая версия), или это какая-то форма расширения?


1
Ответы верны, но есть возможная причина для this->явного использования , которое заключается в том, чтобы явно использовать зафиксированные значения. Обратите внимание, что [](){ calstage1done(); }это не будет законным, потому thisчто не будет захвачено; но при захвате thisявно, это удивительно для функции тела , чтобы появиться на первый взгляд не на самом деле использовать захваченное значение: [this](){ calstage1done(); }.
Кайл Стрэнд

Я могу это видеть, но в то же время это кажется ужасно многословным для того, что должно быть простой задачей.
plugwash

1
Я помню, что у MSVC (возможно, только 2015 г.) также были проблемы с захватом thisи использованием его в лямбда-
выражении,

@plugwash: разработчики, как правило, всегда ленивы и хотят минимизировать вещи, а дизайнеры языка ничем не отличаются. Тем не менее, многословие часто требуется, чтобы устранить неоднозначность, и это имеет место здесь.
Flater

Ответы:


25

Это стандартно и так было с C ++ 11, когда были добавлены лямбды. По данным cppreference.com :

В целях поиска имени, определения типа и значения thisуказателя и для доступа к нестатическим членам класса тело оператора вызова функции закрытого типа рассматривается в контексте лямбда-выражения.

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.