C++ 非捕获lambda生命周期
如果下面的代码在两种情况下都是正确的,我很难找到一个明确的答案,包括不捕获lambda和调用静态函数。我非常确定后者是好的,我关心的是在另一个块/函数调用中“定义”lambda时的生存期,等等。代码似乎工作正常,但我还是想知道为什么。。。非捕获lambda是否最终定义为某种匿名(隐藏)全局符号,因此它基本上与静态函数相同C++ 非捕获lambda生命周期,c++,lambda,C++,Lambda,如果下面的代码在两种情况下都是正确的,我很难找到一个明确的答案,包括不捕获lambda和调用静态函数。我非常确定后者是好的,我关心的是在另一个块/函数调用中“定义”lambda时的生存期,等等。代码似乎工作正常,但我还是想知道为什么。。。非捕获lambda是否最终定义为某种匿名(隐藏)全局符号,因此它基本上与静态函数相同 #包括 类侦听器{ 公众: void event(){printf(“调用的事件());} 静态void forwardEvent(void*userArg){static_c
#包括
类侦听器{
公众:
void event(){printf(“调用的事件());}
静态void forwardEvent(void*userArg){static_cast(userArg)->event();}
};
阶级制作人{
使用侦听器=void(void*arg);
监听器*监听器*;
void*userArg;
公众:
void attachListener(侦听器*侦听器,void*用户参数){
监听器=监听器;
userArg \=userArg;
}
void issueEvent()
};
int main(){
倾听者;
生产者;
{//不同的范围,以防有不同。。。
attachListener(监听器::forwardEvent和监听器);
}
producer.issueEvent();
{//不同的范围,以防有不同。。。
attachListener([](void*userArg){static_cast(userArg)->event();},&listener);
}
producer.issueEvent();
}
好的,那么嵌套的侦听器的定义是这样的
using Listener = void(void* arg);
Listener* listener_;
基本上,您需要处理好的旧函数指针。现在,当您传递函数指针的参数时,您可以这样做
producer.attachListener([](void* userArg) { static_cast<Listener*>(userArg)->event(); }, &listener);
producer.attachListener([](void*userArg){static_cast(userArg)->event();},&listener);
非捕获lambda通过隐式转换转换为函数指针。此函数指针是
保证有效,并指向
行为与调用lambda的操作符()
时完全相同
函数在程序的整个过程中“存在”,它们的地址永远不会悬空。因此,就使用从lambda表达式获得的指针而言,您的代码具有定义良好的行为。@TonyTannous不完全确定这是一个重复。OP特别询问未捕获的lambda。(无论如何,这可能是个骗局)这回答了你的问题吗?另外,在代码示例中有两种“侦听器”类型有点令人困惑。我建议将嵌套类型调用为其他类型。>函数在整个程序期间“存在”,并且它们的地址永远不会悬空。这就是我想听的,谢谢