【发布时间】:2014-01-28 22:22:51
【问题描述】:
我想将 lambda 函数作为回调传递给另一个函数:
void test(const std::function<void()> fn){
fn();
}
它工作正常,一切正常。但。无论我使用多高的编译器优化级别,它都不会内联它:
proof
当我玩了一段时间后,我发现使用模板 - 它变成了内联:
template<typename T>
void test2(T fn){
fn();
}
那么...有没有办法让它在没有模板的情况下内联?以及为什么它与模板声明内联?只有函数类型作为模板参数传递,而不是函数本身。
【问题讨论】:
-
std::function是一个类型擦除类(很可能会通过函数指针间接调用 fn)。通过std::function捕获 lambda 几乎肯定会扼杀你内联它的机会。 -
@Alex 但“typename T”不会扣除相同的 std::function 吗?
-
@tower120 不,lambda 表达式的类型不是
std::function。它是“未命名的、唯一的、非联合类类型,称为闭包类型”。参见 ISO C++ §5.1.2/3。 -
@Alex 您可以使用
decltype或模板参数推导来获取类型,或auto间接使用它。我认为没有其他办法。 -
@Alex 你当然不能使用
auto作为参数类型,但是decltypeis just fine。当然,这意味着你只能传入那个特定的 lambda - 在实践中并不真正可用。