Почему я не могу перехватить лямбда-указатель "this"? - PullRequest
8 голосов
/ 19 октября 2011

Рассмотрим следующий код:

class A
{
public:
    void foo()
    {
        auto functor = [this]() 
            {
                A * a = this;
                auto functor = [a]() // The compiler won't accept "this" instead of "a"
                    {
                        a->bar();
                    };
            };
    }

    void bar() {}
};

В VC2010 использование this вместо a приводит к ошибкам компиляции.Среди прочих:

1>main.cpp(20): error C3480: '`anonymous-namespace'::<lambda0>::__this': a lambda capture variable must be from an enclosing function scope
1>main.cpp(22): error C3493: 'this' cannot be implicitly captured because no default capture mode has been specified

Что я не понимаю.Значит ли это, что он не знает, следует ли ему использовать ссылку или скопировать ее?При попытке использовать &this для принудительной ссылки, он также говорит:

1>main.cpp(20): error C3496: 'this' is always captured by value: '&' ignored

Временное не раздражает, но ради любопытства есть ли способ избавиться от него?Что происходит, когда this дается лямбде?

Ответы [ 2 ]

6 голосов
/ 21 октября 2011

Это похоже на ошибку компилятора в VS2010.Я смог заставить его работать, позволив внутренней лямбде неявно захватить this:

class A
{
public:
    void foo()
    {
        auto functor = [this]() 
        {
            auto functor = [=]()
            {
                bar();
            };
        };
    }

    void bar() {}
};

При попытке использовать & this для принудительной ссылки, он также говорит:

1> main.cpp (20): ошибка C3496: 'this' всегда фиксируется значением: '&' ignored

this может быть захвачено только значением.[=] и [&] оба захватывают его по значению.

Что происходит, когда это дается лямбде?

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

2 голосов
/ 22 октября 2011

Это известная ошибка в компиляторе Visual Studio 2010 (на что ссылается комментарий Фредерика Хамиди).

Вы должны явно захватить this, чтобы передать его в захват другой ламбыСпецификация.Это также относится к локальным переменным, объявленным вне лямбда-вложения лямбды, даже со спецификацией захвата [&].

...