I've been reading a bit about lambda expressions on the internet recently and it seems to me that C++0x's lambda expressions will not have a single type (or types) that will bind exclusively to lambda expressions -- in other words, lambda expressions will only match template arguments or auto
arguments/variables. What happens, as described here, is that
Compilers that support lambdas will create a unique anonymous functor type for each lambda expression
My question is, is that a bad thing? Wouldn't it make sense to have some keyword that matches only to lambda expressions, e.g. lambda
, which would work as follows
void f(std::function<int(int)> func)
{
func(2);
}
template<typename T>
void g(T func)
{
func(2);
}
void h(lambda func)
{
func(2);
}
int main()
{
int fpointer(int);
struct { int operator()(int var) { return var; } } functor;
f(fpointer); //ok (actually a linker error, but for the sake of example)
f(functor); //ok
f([](int var) { return var; }); //ok
g(fpointer); //ok
g(functor); //ok
g([](int var) { return var; }); //ok
h(fpointer); //error -- function pointer isn't a lambda expr
h(functor); //error -- functor isn't a lambda expr
h([](int var) { return var; }); //ok
return 0;
}
To be honest, I actually can't see the usefulness of this (especially given that auto
accepts lambda expressions, so one could then assign a lambda to a variable), but it still doesn't sit right with me that lambda expressions are anonymous types and cannot be bound specifically to just one particular type (to the exclusion of all others).
In essence, my question is, is it fine that lambda expressions are anonymous (both in terms of utility -- does the lack of a lambda
type devoid us of some functionality -- and philosophically -- does it really make sense that lambda expressions always have the 'type' auto
)?
std::function<int(int)>
too. – Johannes Schaub - litbauto
works (afaik), I thought it unnecessary to add another set of example functions/function calls (but it's still good to mention, so thanks litb) – GRBauto
parameter in that case. I am still confident that you can doauto = [](int a) { ... };
however (...right? ;) ) – GRBop()
was that you don't have to worry about the functor type. now if you restrict something to only lambdas (surely i think implementations will provide some__is_lambda
metafunction or something you could use withenable_if
), what sense would it make to get rid of the ability to acccept function pointers etc. I don't see any and i believe there is no sense in it. – Johannes Schaub - litb