std::function可替代函数指针和虚函数但有性能开销;声明需严格匹配签名;传参宜用const引用避免拷贝和悬挂;与bind、lambda组合时需警惕生命周期和捕获问题。
可以,但不是无条件替代。它本质是类型擦除的可调用对象包装器,支持普通函数、lambda、绑定后的成员函数、甚至 functor,但有额外开销(堆分配可能、虚函数调用间接性)。若只传 C 风格函数且性能敏感,void(*)(int) 更轻量;若需捕获上下文或统一接口,std::function 是更通用的选择。
关键在签名匹配:模板参数必须精确对应调用签名(返回类型 + 参数列表),不支持自动转型。常见错误是忽略 const 限定符或引用修饰。
std::functioncb;
cb = [](double x, const std::string& s) -> int { return static_cast(x) + s.length(); }; int my_func(double, const std::string&); cb = my_func;
struct Foo { int bar(int) { return val + i; } int val = 10; }; Foo f; cb = std::bind(&Foo::bar, &f, std::placeholders::_1); // 注意:这里签
名已变为 int(int),与原声明不兼容,需重新定义 std::function直接传值会触发内部存储的拷贝(可能含堆分配),尤其 lambda 捕获大对象时开销明显;若传入临时 lambda 或局部绑定对象,还可能引发悬挂(dangling)。
void process(const std::function& cb) { cb(); }
std::function 对象,除非明确管理其生命周期;若需存储,考虑用 std::shared_ptr 包裹或确保所捕获对象寿命长于该 std::function
std::function,另一个接受模板参数(template void process(F&& f) ),让编译器直接内联std::bind 生成的对象类型复杂,与 std::function 嵌套时容易因占位符顺序或引用折叠出错;lambda 更直观,但默认按值捕获局部变量,可能意外复制大对象或遗漏 mutable 导致无法修改捕获值。
this 捕获必须明确:cb = [this](int x) { return this->member_func(x); },比 std::bind(&Class::f, this, _1) 更安全可控std::function 内部存储的是可调用对象的副本,即使你传入的是引用,它仍会拷贝——这点常被忽略std::function 里存的只是个悬空引用,行为未定义。