C++ 在通用lambda捕获中使用this指针

C++ 在通用lambda捕获中使用this指针,c++,lambda,c++14,C++,Lambda,C++14,我有一个问题,Clang(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(){} 如果我直接调用this->foo(x),这两个编译器都会接受,但我更想知道谁是对的 注意:触

我有一个问题,Clang(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(){}
如果我直接调用
this->foo(x)
,这两个编译器都会接受,但我更想知道谁是对的

注意:触发这种情况需要lambda签名中的“auto”和到std::函数的转换

如果我直接调用这个->foo(x),两个编译器都接受它,但我更想知道谁是对的

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


另外,它有直观的意义,
这个
应该是隐含的。

它配有一个金色徽章和3k+声誉,你肯定知道你必须在问题中添加主语言标签@KerrekSB,显然是Pascal。我永远无法理解为什么人们觉得有必要发表这样的评论,而这并不能阻止他们回答问题。如果你不知道,就继续前进。@Blindy:那太傻了。如果没有主语言标签,这个问题对人数少得多的人来说是显而易见的。对OP和网站都有好处的是,对这个问题感兴趣的人实际上看到了这个问题,并且能够回答它。@KerrekSB这个问题非常特定于C++14,我想大多数了解C++14的人都会看到这个C++14标签。也就是说,我接受你的观点,感谢你的编辑。而且,我的金徽章在早期是用来回答一个无用但很受欢迎的问题的,所以它不算数;)我愿意接受这一点,但尽管我希望“thisless”代码是正确的,但我并不觉得它直观:lambda呈现给我们的方式就像它是代表lambda语句的类中的一个隐藏运算符()。如果按照该行操作,“this->”指的是lambda,而不是包含的类。或者也许我只是想得太多了,从那以后,捕捉“这个”就不可用了。
error: cannot call member function ‘void X::foo(int)’ without object