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。