Коли "це" фіксується лямбда, чи потрібно це явно використовувати?


27

Я знайшов приклади, що вловлюють thisу лямбді явно, використовують це; наприклад:

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

Але, мабуть, це також можна використовувати неявно; наприклад:

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

Я перевірив це в g ++, і він склав.

Це стандарт C ++? (і якщо так, то яка версія) чи це якась форма розширення?


1
Відповіді є правильними, але можлива причина this->явного використання , яка полягає у тому, щоб чітко використані чітко захоплені значення. Зауважте, що [](){ calstage1done(); }це не було б законно, оскільки thisне було б захоплено; але при захопленні thisявно, це дивно для функції тіла , щоб з'явитися на перший погляд не насправді використовувати захоплене значення: [this](){ calstage1done(); }.
Кайл Странд

Я можу це бачити, але в той же час це здається жахливо багатослівним для того, що має бути простим завданням.
підключення

1
Я пам’ятаю, що у MSVC (можливо, лише 2015 рік) також виникли проблеми із захопленням thisта використанням його в лямбда, що також може стати причиною явного використання
Flamefire

@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.