Refering to the C++11 specification (5.1.2.13):
A lambda-expression appearing in a default argument shall not implicitly or explicitly capture any entity.
[ Example:void f2() { int i = 1; void g1(int = ([i]{ return i; })()); // ill-formed void g2(int = ([i]{ return 0; })()); // ill-formed void g3(int = ([=]{ return i; })()); // ill-formed void g4(int = ([=]{ return 0; })()); // OK void g5(int = ([]{ return sizeof i; })()); // OK }
—end example ]
However, can we also use a lambda-expression itself as the default value for a function argument?
e.g.
template<typename functor>
void foo(functor const& f = [](int x){ return x; })
{
}
Yes. In this respect lambda expressions are no different from other expressions (like, say,
0
). But note that deduction is not used with defaulted parameters. In other words, if you declarethen
foo(0);
will callfoo<int>
butfoo()
is ill-formed. You'd need to callfoo<int>()
explicitly. Since in your case you're using a lambda expression nobody can callfoo
since the type of the expression (at the site of the default parameter) is unique. However you can do: