C++ 复制c++;lambda到函数指针引用
我不确定我是否定义了以下情况下的行为: 我的函数指针类型:C++ 复制c++;lambda到函数指针引用,c++,lambda,scope,reference,function-pointers,C++,Lambda,Scope,Reference,Function Pointers,我不确定我是否定义了以下情况下的行为: 我的函数指针类型: typedef void (*DoAfter_cb_type)(void); 应分配回调的函数: void DoSomething(DoAfter_cb_type & DoAfter_cb) { //... DoAfter_cb = [](){ //... }; } 来电者: DoAfter_cb_type DoAfter_cb = nullptr; DoSomething(DoA
typedef void (*DoAfter_cb_type)(void);
应分配回调的函数:
void DoSomething(DoAfter_cb_type & DoAfter_cb)
{
//...
DoAfter_cb = [](){
//...
};
}
来电者:
DoAfter_cb_type DoAfter_cb = nullptr;
DoSomething(DoAfter_cb);
// Here is something that has to be done after DoSomething but before DoAfter_cb.
if( DoAfter_cb != nullptr){
DoAfter_cb();
}
据我所知,lambda可以隐式转换为函数指针
然而,这些仍然是指针,我担心调用lambda的重要内容存储在堆栈上,如果我只返回函数指针,这些内容将超出范围
我必须使用函数指针,因为我无法在我的环境中访问std::function。
使用std::function,我希望lambda对象存储在引用变量中,不会有任何问题
行为是否与我定义一个普通函数相同,或者我在这里是否有任何副作用
行为是否与我定义一个普通函数相同,或者我在这里是否有任何副作用
是的,是一样的。一个无限制的lambda可转换为正则函数指针,因为引用C++标准(强调矿山):
非泛型lambda表达式的闭包类型没有
lambda capture有一个到指针的转换函数
具有相同参数和返回类型的C++语言链接
闭包类型的函数调用运算符。转换为“指针”
如果函数调用运算符具有非抛出
异常规范此转换返回的值
函数是函数F的地址,当调用该函数时
与调用闭包类型的函数调用运算符的效果相同。
因此,当lambda超出范围时,该指针由适当的函数支持,就像您自己在文件范围中编写它一样。函数在程序的整个执行过程中都是“活动”的,因此指针始终是有效的 Boost没有
Boost::function
?IIRC C++11从那里得到了它。不幸的是,我也不能使用boost。