为什么我没有用lambda捕获“this”指针?

时间:2011-10-19 19:05:48

标签: c++ c++11 lambda this

请考虑以下代码:

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赋予lambda时会发生什么?

2 个答案:

答案 0 :(得分:6)

这似乎是VS2010中的编译器错误。通过让内部lambda隐式捕获this

,我能够使它工作
class A
{
public:
    void foo()
    {
        auto functor = [this]() 
        {
            auto functor = [=]()
            {
                bar();
            };
        };
    }

    void bar() {}
};

  

当尝试使用&amp; this强制引用时,它还会说:

     

1&gt; main.cpp(20):错误C3496:'this'始终按值捕获:'&amp;'忽略

this只能按值捕获。 [=][&]都按值捕获。

  

当给予lambda时会发生什么?

我不知道,但它必须是特殊的东西,因为你不能在lambda中使用this作为指向lambda对象的指针。其他任何捕获的都会成为lambda的私有成员,因此大概this也会这样做,但是在使用方面有一些特殊处理。

答案 1 :(得分:2)

This is a known bug with the Visual Studio 2010 compiler(由FrédéricHamidi的评论引用)。

您必须明确捕获this以将其传递给另一个lamba的捕获规范。这也适用于在lambda的封闭lambda之外声明的局部变量,即使使用[&]捕获规范也是如此。