Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 非捕获lambda生命周期_C++_Lambda - Fatal编程技术网

C++ 非捕获lambda生命周期

C++ 非捕获lambda生命周期,c++,lambda,C++,Lambda,如果下面的代码在两种情况下都是正确的,我很难找到一个明确的答案,包括不捕获lambda和调用静态函数。我非常确定后者是好的,我关心的是在另一个块/函数调用中“定义”lambda时的生存期,等等。代码似乎工作正常,但我还是想知道为什么。。。非捕获lambda是否最终定义为某种匿名(隐藏)全局符号,因此它基本上与静态函数相同 #包括 类侦听器{ 公众: void event(){printf(“调用的事件());} 静态void forwardEvent(void*userArg){static_c

如果下面的代码在两种情况下都是正确的,我很难找到一个明确的答案,包括不捕获lambda和调用静态函数。我非常确定后者是好的,我关心的是在另一个块/函数调用中“定义”lambda时的生存期,等等。代码似乎工作正常,但我还是想知道为什么。。。非捕获lambda是否最终定义为某种匿名(隐藏)全局符号,因此它基本上与静态函数相同

#包括
类侦听器{
公众:
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。(无论如何,这可能是个骗局)这回答了你的问题吗?另外,在代码示例中有两种“侦听器”类型有点令人困惑。我建议将嵌套类型调用为其他类型。>函数在整个程序期间“存在”,并且它们的地址永远不会悬空。这就是我想听的,谢谢