Ответ 1
Вы можете использовать перегрузку:
int foo(int i)
{
return foo(i, [](int x) -> int { return x / 2; });
}
int foo(int i, std::function<int(int)> f)
{
return f(i);
}
Как назначить лямбда в качестве аргумента по умолчанию? Я хотел бы сделать это:
int foo(int i, std::function<int(int)> f = [](int x) -> int { return x / 2; })
{
return f(i);
}
но мой компилятор (g++ 4.6 на Mac OS X) жалуется:
error: local variable 'x' may not appear in this context
ИЗМЕНИТЬ: В самом деле, это была ошибка компилятора. Вышеприведенный код отлично работает с последней версией gcc (4.7-20120225).
Вы можете использовать перегрузку:
int foo(int i)
{
return foo(i, [](int x) -> int { return x / 2; });
}
int foo(int i, std::function<int(int)> f)
{
return f(i);
}
Кажется, это ошибка в gcc; стандарт допускает лямбда-выражения в параметрах по умолчанию, пока ничего не зафиксировано.
Кажется, что все FDIS говорит о lambdas в параметрах по умолчанию, поэтому любое использование, кроме запрещенного здесь, должно быть разрешено по умолчанию.
С++ 11 FDIS 5.1.2/13
Лямбда-выражение, появляющееся в аргумент по умолчанию не должен подразумеваться или явно захватить любой объект.
[Пример:
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 }
- конец примера]