c++11(G++ only)的lambda表达式无法访问类的私有成员,怎么绕过?
大家讲道理
大家讲道理 2017-04-17 11:22:53
[C++讨论组]

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

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

全部回复(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();
}
PHP中文网

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号