【问题标题】:Copying c++ lambda to Function Pointer reference将 c++ lambda 复制到函数指针引用
【发布时间】:2018-04-05 07:31:54
【问题描述】:

我不确定我是否定义了以下情况下的行为:

我的函数指针类型:

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();
}

据我所知here lambda 可以隐式转换为函数指针。

但是这些仍然是指针,我担心调用 lambda 的一些重要内容存储在堆栈中,如果我只返回函数指针就会超出范围

我必须使用函数指针,因为我无法在我的环境中访问 std::function。 使用 std::function 我希望 lambda 对象存储在引用变量中,我不会有任何问题。

行为是否与如果我只定义一个普通函数一样,还是在这里有任何副作用?

【问题讨论】:

  • Boost 没有 boost::function<> 吗? IIRC C++11 从那里得到它。
  • 不幸的是我也不能使用 boost。

标签: c++ lambda scope reference function-pointers


【解决方案1】:

行为是否与如果我只定义一个普通函数一样,还是在这里有任何副作用?

是的,它是一样的。无捕获 lambda 可转换为常规函数指针,因为引用 C++ 标准([expr.prim.lambda.closure]/6,强调我的):

非泛型 lambda 表达式的闭包类型,没有 lambda-capture 有一个转换函数来指向函数的指针 具有相同参数和返回类型的 C++ 语言链接 闭包类型的函数调用运算符。转换为“指针 到 noexcept 函数”,如果函数调用运算符有一个非抛出 异常规范。 此次转化返回的价值 function 是函数 F 的地址,当被调用时,函数 F 具有 与调用闭包类型的函数调用运算符的效果相同。

因此,当 lambda 超出范围时,该指针由适当的函数支持,就像您在文件范围内自己编写一样。函数在程序的整个执行过程中“活动”,因此指针始终有效。

【讨论】:

    猜你喜欢
    • 2021-10-05
    • 2020-06-05
    • 1970-01-01
    • 1970-01-01
    • 2015-10-15
    • 2013-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多