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

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
我猜他们已经放弃治疗了……


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


auto func = &A::Somefunc;


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


this->A::Sommfunc();

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


用using关键字改变成员访问性可行否


用一个很猎奇的方法绕过了……但是注意这个做法实际是有些问题的(比如E重载了Somefunc,但是我想染B调用A的Somefunc,似乎包含lambda的struct不是A的friend类导致这个bug)期待更好的做法。

#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;
        auto this_point_maker = [&] {
            return this;
        };
        C.D([&](){
            this_point_maker()->Somefunc(); // now works
        });
    }
};
int main(){
    E F;
    F.Myfunc();
}
【热门文章】
【热门文章】