在通用拉姆达捕获使用该指针
问题描述:
我有一个问题,其中铛(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 <>都需要触发这种情况。
答
如果我直接调用this-> foo(x),两个编译器都会接受它,但我宁愿知道谁是对的。
考虑到它在gcc 5.2中编译,clang是在你的具体情况下正确的一个。它看起来只是gcc 5.1中的一个bug。 gcc 6.0也编译这个罚款。
加上它很直观,this
应该暗示。
+0
我想接受这一点,但尽管我希望“无用”代码是正确的,我不觉得它很直观:lambdas已经呈现给我们的方式就好像它是一个表示lambda语句的类中的隐藏运算符()。如果您遵循该行,“this->”指的是lambda,而不是包含的类。或者也许我只是在推翻它,因为那样会使捕捉“这个”变得无法使用。 –
它在[GCC 5.2](http://melpon.org/wandbox/permlink/dQyllaVrippXSDlZ)中编译 –
带有金色徽章和3k +声望,您肯定知道您必须将主要语言标记添加到问题? –
@KerrekSB,显然是帕斯卡。我永远不会明白,为什么人们觉得有必要做出这样的评论,当它不阻止他们回答这个问题时。如果你不知道继续前进。 – Blindy