c++11(G++ only)的lambda表达式无法访问类的私有成员,怎么绕过?


似乎是GCC的bug,但是这个bug好像2012年就有了,到现在也没有fix……


 #include <cstdio>

class A{
protected:
    void Somefunc(){
        printf("Hello world!");
    }
};
class B{
public:
    template<class F>
    void D(F func){
        func();
    }
};
class E : public A{
public:
    void Myfunc(){
        A::Somefunc(); // works
        B C;
        C.D([&](){
            A::Somefunc(); // not works
        });
    }
};
int main(){
    E F;
    F.Myfunc();
}

Bug 58972 – Lambda can't access private members
我猜他们已经放弃治疗了……

c++11 C++

hankcs 10 years, 7 months ago
  • 感觉在lambda中不允许访问私有成员也是有一定道理的,lambda的作用域是单独。
  • Bug 58972 的问题在 gcc 4.8.2 上测试,编译已经不出错了。
  • lambda表达式可以传入this,如果A中的方法没有被重载直接 this->Somefunc() 。但是如果被E重载后,需要调用就麻烦了。

我尝试了以下方式来获取。


 
auto func = &A::Somefunc;


 
auto func = std::bind(&A::Somefunc, this);


 
this->A::Sommfunc();

都被编译器拒绝了,包括clang++和g++。

cacezx answered 10 years, 7 months ago

Your Answer