首页 > 解决方案 > 在类中声明的 lambda 表达式是否是该类的成员?

问题描述

这是我的问题的另一个标题:是否允许 lambda 表达式中的私有/受保护成员访问?

还有一个,A lambda 可以访问周围范围的变量。周围的范围究竟是什么?


我知道的事实:


简而言之,下面是一个代码片段,展示了我的困惑。

我已经在GCC 7.4.0(WSL 上的 Ubuntu 18.04)和CL 19.22.27905(VS2019 社区)上对其进行了测试,并且在这两个平台上,此代码都已通过。


class A {
    int a = 0;
 public:
    void access();
};

A* getPointer() {
    static A a;
    return &a;
}

void runFunction(void(*fp)(int i)) {
    fp(1);
}

void A::access() {
    runFunction([](int i){
        getPointer()->a = i;  // Here, is the access of variable `a` legal?
    });
}


// Just for running the program
int main() {
    getPointer()->access();
}

一方面,这是合法的,因为该变量被access()类的成员函数()使用(事实 2)。

但另一方面,该函数并不直接访问它。相反,它是在 lambda 表达式中访问的,该表达式被转换为函数指针。

在这种情况下,A::access()应该类似于:

void lambda(int i) {
    getPointer()->a = i;
}

void A::access() {
    runFunction(lambda);
}

这段代码肯定有语法错误。

我有点困惑。

标签: c++c++11lambdaaccess-control

解决方案


推荐阅读