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
我猜他们已经放弃治疗了……
hankcs
10 years, 7 months ago
Answers
- 感觉在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