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

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

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

EDIT : Действительно,ошибка компилятора.Приведенный выше код прекрасно работает с последней версией gcc (4.7-20120225).

Ответы [ 2 ]

27 голосов
/ 17 мая 2011

Вы можете использовать перегрузку:

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);
}
8 голосов
/ 17 мая 2011

Это похоже на ошибку в gcc; стандарт разрешает лямбда-выражения в параметрах по умолчанию, пока ничего не записано.

Следующее, кажется, все, что FDIS говорит о лямбдах в параметрах по умолчанию, поэтому любое использование, кроме того, что запрещено здесь, должно быть разрешено по умолчанию.

C ++ 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
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...