lambda会在模板化代码中衰减到函数指针吗?

时间:2010-07-01 07:38:53

标签: c++ templates lambda c++11 function-pointers

我在某处读到,如果捕获列表为空,则lambda函数应该衰减为函数指针。我现在能找到的唯一参考是n3052。使用g ++(4.5& 4.6)它可以按预期工作,除非lambda在模板代码中声明。

例如,以下代码编译:

void foo() {
    void (*f)(void) = []{};
}

但它在模板化时不再编译(如果foo实际上是在别处调用的话):

template<class T>
void foo() {
    void (*f)(void) = []{};
}

在上面的参考文献中,我没有看到对此行为的解释。这是g ++的临时限制,如果没有,是否有(技术)原因不允许这样做?

1 个答案:

答案 0 :(得分:3)

我认为没有理由不被特别禁止。我猜这只是g ++的暂时限制。

我还尝试了其他一些事情:

template <class T>
void foo(void (*f)(void)) {}

foo<int>([]{});

有效。

typedef void (*fun)(void);

template <class T>
fun foo() { return []{}; } // error: Cannot convert.

foo<int>()();

那不是(但如果foo没有参数化的话。)

注意:我只在g ++ 4.5中测试过。