You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++如何在函数内创建静态函数并返回携带入参函数的该静态函数

问题原因分析

  • 原生函数指针版本编译失败的核心原因:只有无捕获的lambda表达式才能隐式转换为普通函数指针,你写的lambda捕获了入参foo,自然无法转换为void(*)()类型,因此编译报错。
  • std::function版本运行异常的原因有两个:
    1. 静态变量temp只会在第一次调用Foo时完成初始化,后续再调用Foo也不会更新temp的值,无法实现每次传入新的函数都生效的需求。
    2. lambda使用了引用捕获[&],捕获的是Foo的局部入参func的引用,Foo调用结束后func就会被销毁,后续调用返回的std::function时会访问悬垂引用,属于未定义行为。

修正方案

如果你确实需要使用函数内部的静态存储可调用对象,按如下方式修改即可:

#include <iostream>
#include <functional>

std::function<void(void)> Foo(std::function<void(void)> func)
{
    // 仅声明静态变量,不做初始化
    static std::function<void(void)> temp;
    // 每次调用都更新值,使用值捕获避免悬垂引用
    temp = [func]() { func(); };
    return temp;
}

int main()
{
    auto f = Foo([]() { std::cout << 123 << '\n'; });
    f(); // 正常输出123
    // 第二次调用测试
    Foo([]() { std::cout << 456 << '\n'; })(); // 正常输出456
}

如果不需要全局共享这个内部可调用对象,直接去掉static关键字即可,每次调用Foo都会返回独立的、绑定了当前入参的可调用对象,更符合绝大多数场景的使用需求。

内容的提问来源于stack exchange,提问作者Jurby

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 23:36:03