C++如何在函数内创建静态函数并返回携带入参函数的该静态函数
问题原因分析
- 原生函数指针版本编译失败的核心原因:只有无捕获的lambda表达式才能隐式转换为普通函数指针,你写的lambda捕获了入参
foo,自然无法转换为void(*)()类型,因此编译报错。 std::function版本运行异常的原因有两个:- 静态变量
temp只会在第一次调用Foo时完成初始化,后续再调用Foo也不会更新temp的值,无法实现每次传入新的函数都生效的需求。 - 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
相关产品推荐
相关产品推荐

