在通用拉姆达捕获使用该指针

问题描述:

我有一个问题,其中铛(3.6)和G ++(5.1)具有一个不同的观点:在通用拉姆达捕获使用该指针

#include <functional> 

struct X 
{ 
    X() 
    { 
     std::function<void (int)> f = [this](auto x){foo(x);}; 
    } 

    void foo(int x){} 
}; 

int main(){} 

铛接受此,而G ++规定:

error: cannot call member function ‘void X::foo(int)’ without object 

如果我直接调用this->foo(x),两个编译器都会接受它,但我宁愿知道谁是对的。

注意:lambda签名中的“auto”和转换为std :: function <>都需要触发这种情况。

+5

它在[GCC 5.2](http://melpon.org/wandbox/permlink/dQyllaVrippXSDlZ)中编译 –

+1

带有金色徽章和3k +声望,您肯定知道您必须将主要语言标记添加到问题? –

+0

@KerrekSB,显然是帕斯卡。我永远不会明白,为什么人们觉得有必要做出这样的评论,当它不阻止他们回答这个问题时。如果你不知道继续前进。 – Blindy

如果我直接调用this-> foo(x),两个编译器都会接受它,但我宁愿知道谁是对的。

考虑到它在gcc 5.2中编译,clang是在你的具体情况下正确的一个。它看起来只是gcc 5.1中的一个bug。 gcc 6.0也编译这个罚款。

加上它很直观,this应该暗示。

+0

我想接受这一点,但尽管我希望“无用”代码是正确的,我不觉得它很直观:lambdas已经呈现给我们的方式就好像它是一个表示lambda语句的类中的隐藏运算符()。如果您遵循该行,“this->”指的是lambda,而不是包含的类。或者也许我只是在推翻它,因为那样会使捕捉“这个”变得无法使用。 –