views:

117

answers:

1

I read somewhere that a lambda function should decay to function pointer if the capture list is empty. The only reference I can find now is n3052. With g++ (4.5 & 4.6) it works as expected, unless the lambda is declared within template code.

For example the following code compiles:

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

But it doesn't compile anymore when templated (if foo is actually called elsewhere):

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

In the reference above, I don't see an explanation of this behaviour. Is this a temporary limitation of g++, and if not, is there a (technical) reason not to allow this?

+2  A: 

I can think of no reason that it would be specifically disallowed. I'm guessing that it's just a temporary limitation of g++.

I also tried a few other things:

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

foo<int>([]{});

That works.

typedef void (*fun)(void);

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

foo<int>()();

That doesn't (but does if foo is not parameterized).

Note: I only tested in g++ 4.5.

Peter Alexander
Yes, in the first case the lambda is declared in a non-template portion of code (although it is used by a template function). The same problem happens when the lambda is declared inside a template class.
rafak