Should lambda decay to function pointer in templated code?
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 开发者_StackOverflow中文版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?
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.
精彩评论