Указание лямбда-функции в качестве аргумента по умолчанию

Как назначить лямбда в качестве аргумента по умолчанию? Я хотел бы сделать это:

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).

Ответ 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);
}

Ответ 2

Кажется, это ошибка в 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
}

- конец примера]