在某些情况下,当使用 C 语言编写的涉及回调的库进行编程时,我喜欢使用 Lambda 表达式;但是,如果我需要更改类成员变量的状态,我不能将其传递this
给无状态(函数指针)lambda。但我可以分配this
给上下文结构中的数据。我觉得奇怪的是能够访问该成员变量,即使它在类中是私有的。这是我为演示而编写的示例代码。
#include <iostream>
using std::cout;
typedef struct extradatatype{
void* data;
}extradata;
extradata e = {0};
typedef void(*callback)(extradata* e);
void cb(callback c){
c(&e);
}
class Test{
private:
int x;
public:
Test(int x){
this->x = x;
}
void setcb(){
cb([](extradata* e){
Test* self = reinterpret_cast<Test*>(e->data);
self->x = 20;
});
}
int getx(){
return x;
}
};
int main(){
Test t(10);
e.data = &t;
t.setcb();
cout << t.getx();
return 0;
}
在 Lambda 表达式Test* self
中,e->data
我可以访问self->x
它,就像它是公共成员而不是私有成员一样。所以我感到困惑的是,lambda 表达式表达式是在setcb
函数的堆栈/上下文中执行,还是在其他地方作为自己的函数执行,但是 C++ 正在做一些奇怪的技巧来允许访问私有成员。因为我假设无状态 lambda 实际上与无法访问类的私有成员的非成员静态函数没有什么不同。