将 C++11 std::function 传递给采用 boost::function 的遗留函数是否安全

Is it safe to pass C++11 std::function to a legacy function that takes boost::function

我们有一个集中使用 boost::function 的遗留系统,现在它决定转向更新的现代 C++ 标准。假设我们有一个这样的遗留函数:

void someFunction(boost::function<void(int)>);

直接传入C++11函数安全吗?

//calling site, new C++11 code
std::function<void(int)> func = [](int x){
    //some implementation
}
someFunction(func); //will this always work?

boost::function 是否也能优雅地处理标准 C++11 lambda?

// will this also work?
someFunction([](int x)->void{
    //some implementation
});

是的,这会起作用。

重要的是你不应该混淆类型安全兼容性。你没有超过std::functionboost::function。你告诉编译器 wrap you std::function into a boost::function.

这可能效率不高 - 因为每个都会在调用时添加另一层间接。但它会起作用。

lambda 也是如此:lambda 没有什么神奇之处,它只是函数对象的语法糖。