当lambda捕获“ ​​this”时,是否必须明确使用它?


27

我发现this在lambda 中捕获的示例显式使用了它。例如:

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

但是似乎也可以隐式使用它。例如:

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

我在g ++中对此进行了测试,并对其进行了编译。

这是标准的C ++吗?(如果可以,是哪个版本),还是某种扩展形式?


1
答案是正确的,但是使用this->显式使用是有可能的,这是为了确保显式使用显式捕获的值。注意那[](){ calstage1done(); }是不合法的,因为this不会被捕获;但拍摄时this明确地说,这是令人惊讶的功能身体出现一目了然没有实际使用捕捉值:[this](){ calstage1done(); }
凯尔·斯特兰德

我可以看到这一点,但与此同时,对于应该是一个简单的任务而言,它似乎太冗长了。
–plugwash

1
我记得MSVC(也许只有2015年)this在lambda中捕获和使用它时也存在问题,这也可能是明确使用它的原因
Flamefire

@plugwash:开发人员通常总是很懒惰,并且希望将事情减至最少,而语言设计师也是如此。但是,通常需要冗长才能解决歧义,在这里就是这种情况。
扁平的

Answers:


25

这是标准的,并且从C ++ 11开始添加lambda以来一直采用这种方式。根据cppreference.com

为了进行名称查找,确定this指针的类型和值 以及访问非静态类成员,在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*
        };
    }
};

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.