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

阅读 7.3k
3 个回答
  • 感觉在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++。

用一个很猎奇的方法绕过了……但是注意这个做法实际是有些问题的(比如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();
}

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏